加了一些花的最短路,点的个数为500不需要堆优化,改一下dij的判断条件就可以了。

上代码:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=;
const int inf=0x3f3f3f3f; struct node
{
int id;
int cost;
int time;
}; int s,e;
int n,m;
vector<int> line0;
vector<int> line1;
vector<node> edge[maxn];
int d0[maxn];
int d1[maxn]; void build_map()
{
int v1,v2,ow,cost,time;
scanf("%d %d %d %d %d",&v1,&v2,&ow,&cost,&time);
node temp;
temp.cost=cost;
temp.time=time;
temp.id=v2;
edge[v1].push_back(temp);
if(ow==)
{
temp.id=v1;
edge[v2].push_back(temp);
}
} void dij0() // deug
{
int vis[maxn];
int pre[maxn];
int cost[maxn];
cost[s]=;
pre[s]=-;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++) d0[i]=inf;
d0[s]=;
while()
{
int v=-;
for(int i=;i<=n;i++)
{
if(vis[i]== && ( v==- || d0[v] > d0[i])) v=i;
}
if(v==-) break;
vis[v]=;
int len=edge[v].size();
for(int i=;i<len;i++)
{
node temp=edge[v][i];
if(vis[temp.id] == )
{
if(d0[temp.id] > d0[v]+temp.time )
{
d0[temp.id]=d0[v]+temp.time; //
pre[temp.id]=v;
cost[temp.id]=cost[v]+temp.cost;
}
else if(d0[temp.id] == d0[v]+temp.time)
{
if(cost[temp.id] > cost[v]+temp.cost)
{
cost[temp.id]=cost[v]+temp.cost;
pre[temp.id]=v;
}
} }
}
}
// cout<<"1"<<endl;
int zz=e;
line0.push_back(e);
while(pre[zz]!=-) //
{
line0.push_back(pre[zz]);
zz=pre[zz];
// cout<<zz<<endl;
}
//cout<<"2"<<endl; reverse(line0.begin(),line0.end());
} void dij1() // deug
{
int vis[maxn];
int pre[maxn];
int cost[maxn];
cost[s]=;
pre[s]=-;
memset(vis,,sizeof(vis));
// vis[s]=1;
for(int i=;i<=n;i++) d1[i]=inf;
d1[s]=;
while()
{
int v=-;
for(int i=;i<=n;i++)
{
if(vis[i]== && (v==- || d1[v] > d1[i])) v=i;
}
if(v==-) break;
vis[v]=;
// line1.push_back(v);
int len=edge[v].size();
for(int i=;i<len;i++)
{
node temp=edge[v][i];
if(vis[temp.id]==)
{
if(d1[temp.id] > d1[v]+temp.cost)
{
d1[temp.id]=d1[v]+temp.cost; //
pre[temp.id]=v;
cost[temp.id]=cost[v]+;
}
else if(d1[temp.id] == d1[v]+temp.cost)
{
if(cost[temp.id] > cost[v]+)
{
cost[temp.id]=cost[v]+;
pre[temp.id]=v;
}
}
} }
} int zz=e; // route
line1.push_back(e);
while(pre[zz]!=-)
{
line1.push_back(pre[zz]);
zz=pre[zz];
} reverse(line1.begin(),line1.end());
}
int check()
{
int len1=line1.size();
int len0=line0.size();
if(len1 != len0) return ;
for(int i=;i<len1;i++)
{
if(line0[i] != line1[i]) return ;
}
return -;
} int main()
{
cin>>n>>m;
while(m--) build_map();
cin>>s>>e;
dij0();// 0 refers to the shortest time
dij1();// 1 refers to the shortset cost
if(check() == ) // diff
{
printf("Time = %d: ",d0[e]);
cout<<line0[];
for(int i=;i<line0.size();i++) cout<<" => "<<line0[i];
cout<<endl; printf("Distance = %d: ",d1[e]);
cout<<line1[];
for(int i=;i<line1.size();i++) cout<<" => "<<line1[i];
cout<<endl;
}
else
{
printf("Time = %d; ",d0[e]);
printf("Distance = %d: ",d1[e]);
cout<<line1[];
for(int i=;i<line1.size();i++) cout<<" => "<<line1[i];
cout<<endl;
}
return ;
}

pat天梯赛练习集合 L3-007 天梯地图的更多相关文章

  1. PAT 天梯赛 L2-005 集合相似度

    set的应用 题目链接 题解 有点像集合的交并操作,直接利用set进行处理,因为set有去重的功能,而且set是利用红黑树实现的,查找速度快O(logN). 代码如下: #include<cst ...

  2. PAT天梯赛L2-005 集合相似度

    题目链接:点击打开链接 给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数.你的任务就是计算任意一对给定集合的 ...

  3. PAT 天梯赛 L2-005. 集合相似度 【SET】

    题目链接 https://www.patest.cn/contests/gplt/L2-005 思路 因为集合中的元素 是不重复的 所以用SET 来保存 集合 然后最后 查找一下 两个集合中共有元素 ...

  4. 天梯赛 L2-005 集合相似度 (set容器)

    给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数.你的任务就是计算任意一对给定集合的相似度. 输入格式: 输 ...

  5. 天梯赛 - L2-005 集合相似度

    题目链接:https://www.patest.cn/contests/gplt/L2-005 这个题理解是个大问题啊,“给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合 ...

  6. PAT天梯赛 L1-049 天梯赛座位分配

    题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...

  7. PAT L1 049 天梯赛座位分配

    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...

  8. PAT天梯赛L3-007 天梯地图

    题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...

  9. pat 团体天梯赛 L3-007. 天梯地图

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

随机推荐

  1. 谱聚类算法及其代码(Spectral Clustering)

    https://blog.csdn.net/liu1194397014/article/details/52990015 https://blog.csdn.net/u011089523/articl ...

  2. 笔记 - DBSherlock: A Performance Diagnostic Tool for Transactional Databases

    OLTP系统的问题很难排查和定位,这就是为什么要花那么多钱去请DBA 因为TP系统的请求很多都是毫秒级别,而且同时有大量的并发,所以由于资源,或随机的原因导致的问题,很难去定位根因 哪怕数据库系统尤其 ...

  3. openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍

    openresty开发系列2--nginx的简单安装,正向.反向代理及常用命令和信号控制介绍 一.nginx的安装下载及编译安装1.Nginx下载:nginx-1.13.0.tar.gz,下载到:/u ...

  4. windows下新增项目本地通过git bash推送至远程github

    本地E盘workspace目录下新增了spring-cloud-alibaba-demo项目,还没有编译过,没有target等不需要推送至git的文件,所以就直接用git bash丢到github了. ...

  5. RabbitMQ 入门教程(PHP版) 第六部分:远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,把一部分计算任务分配到其他节点来完成.RabbitMQ 如何使用 RPC 呢?下面将会通过其它节点完成斐波纳契示例. 流程图  当客户端启动时,它 ...

  6. MVC ViewBag和ViewData的使用

    ViewBag public ActionResult About() { ViewBag.Message = "Your application description page.&quo ...

  7. IIS+PHP本地开发环境配置

    打开Win7系统自带IIS.如图只要点击两下,CGI一定要勾选上!完成后打开浏览器输入127.0.0.1测试一下,如果能打开页面说明iis开启成功. 安装PHP.不同版本的PHP会有所不同,这里使用的 ...

  8. linux系统实现多个进程监听同一个端口

    通过 fork 创建子进程的方式可以实现父子进程监听相同的端口. 方法:在绑定端口号(bind函数)之后,监听端口号之前(listen函数),用fork()函数生成子进程,这样子进程就可以克隆父进程, ...

  9. C++标准模板库集合类与映射类总结

    一.STL集合类 标准模板库向程序员提供了一些容器类,以便在应用程序中频繁而快速的搜索.std::set和std::multiset用于存储一组经过排序的元素,其查找元素的复杂度为对数,而unorde ...

  10. 对String对象进行JSON序列化

    对对象进行JSON序列化,会得到类似key:value的形式. 但是如果对一个String字符串进行JSON序列化会得到什么? 测试下: public class TestMain2 {     pu ...