PTA天梯地图
本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线;一条是最短距离的路线。题目保证对任意的查询请求,地图上都至少存在一条可达路线。
输入格式:
输入在第一行给出两个正整数N
(2 ≤ N
≤ 500)和M
,分别为地图中所有标记地点的个数和连接地点的道路条数。随后M
行,每行按如下格式给出一条道路的信息:
V1 V2 one-way length time
其中V1
和V2
是道路的两个端点的编号(从0到N
-1);如果该道路是从V1
到V2
的单行线,则one-way
为1,否则为0;length
是道路的长度;time
是通过该路所需要的时间。最后给出一对起点和终点的编号。
输出格式:
首先按下列格式输出最快到达的时间T
和用节点编号表示的路线:
Time = T: 起点 => 节点1 => ... => 终点
然后在下一行按下列格式输出最短距离D
和用节点编号表示的路线:
Distance = D: 起点 => 节点1 => ... => 终点
如果最快到达路线不唯一,则输出几条最快路线中最短的那条,题目保证这条路线是唯一的。而如果最短距离的路线不唯一,则输出途径节点数最少的那条,题目保证这条路线是唯一的。
如果这两条路线是完全一样的,则按下列格式输出:
Time = T; Distance = D: 起点 => 节点1 => ... => 终点
输入样例1:
10 15
0 1 0 1 1
8 0 0 1 1
4 8 1 1 1
5 4 0 2 3
5 9 1 1 4
0 6 0 1 1
7 3 1 1 2
8 3 1 1 2
2 5 0 2 2
2 1 1 1 1
1 5 0 1 3
1 4 0 1 1
9 7 1 1 3
3 1 0 2 5
6 3 1 2 1
5 3
输出样例1:
Time = 6: 5 => 4 => 8 => 3
Distance = 3: 5 => 1 => 3
输入样例2:
7 9
0 4 1 1 1
1 6 1 3 1
2 6 1 1 1
2 5 1 2 2
3 0 0 1 1
3 1 1 3 1
3 2 1 2 1
4 5 0 2 2
6 5 1 2 1
3 5
输出样例2:
Time = 3; Distance = 4: 3 => 2 => 5
解题思路:当时建图的时候把距离搞成了点的距离,和城市间紧急救援搞混了,看了一晚上自己的代码都没看出来,最后请教了Bob才知道,大佬的博客https://www.cnblogs.com/BobHuang/
菜鸡的成长史 ^_^
代码有点乱等以后来改进
- #include <bits/stdc++.h>
- using namespace std;
- const int N=,INF=0x3f3f3f3f;
- int n,m;
- struct edg
- {
- int B,J,S;
- }E1,E2; //存边的信息,因为这个一条边有3个信息
- vector<edg>G[N],T[N];
- int dis[N],pre[N],vis[N],in[N],num[N],out[N];
- int diss[N],sum[N];
- struct Node
- {
- int B,J;
- bool operator <(const Node&x)const{
- return x.J<J;
- }
- }p,q;
- void printff(vector<int> vec)
- {
- int flag=;
- for(int i=vec.size()-;i>=;i--)
- {
- if(flag) cout << " => ";
- cout << vec[i],flag=;
- }
- cout << endl;
- }
- int judge(vector<int>vec,vector<int>vec1)
- {
- for(int i=;i<vec.size();i++)
- if(vec[i]!=vec1[i]) return ; //不相等就退出
- return ;
- }
- void dij1(int start)
- {
- priority_queue<Node> que;
- for(int i=;i<=N-;i++) dis[i]=INF,pre[i]=-,vis[i]=;
- que.push({start,}),dis[start]=,num[start]=;
- while(!que.empty())
- {
- p=que.top(),que.pop();
- int u=p.B,v,w,z;
- if(vis[u]) continue;
- vis[u]=;
- for(auto X:G[u])
- {
- v=X.B,w=X.J,z=;
- if(dis[v]>w+p.J)
- dis[v]=w+p.J,pre[v]=u,num[v]=num[u]+,q.B=v,q.J=dis[v],que.push(q);
- else if(dis[v]==w+p.J)
- {
- if(num[v]>num[u]+) //节点数取小的
- num[v]=num[u]+,pre[v]=u;
- }
- }
- }
- }
- void dij2(int start) //时间加距离
- {
- priority_queue<Node> que;
- for(int i=;i<=N-;i++) pre[i]=-,vis[i]=,sum[i]=INF,diss[i]=;
- que.push({start,}),diss[start]=,sum[start]=; //自己到自己的距离和时间都为0
- while(!que.empty())
- {
- p=que.top(),que.pop();
- int u=p.B,v,w,z;
- if(vis[u]) continue;
- vis[u]=;
- for(auto X:G[u])
- {
- v=X.B,w=X.J,z=X.S; //压入的是时间
- if(sum[v]>z+p.J)
- sum[v]=z+p.J,pre[v]=u,diss[v]=diss[u]+w,q.B=v,q.J=sum[v],que.push(q);
- else if(sum[v]==z+p.J)
- {
- if(diss[v]>diss[u]+w) //节点数取小的
- diss[v]=diss[u]+w,pre[v]=u;
- }
- }
- }
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin>>n>>m;
- for(int i=,d1,d2,d3,d4,d5;i<m;i++)
- {
- cin>>d1>>d2>>d3>>d4>>d5;
- G[d1].push_back({d2,d4,d5}); //G 最短中最快
- if(!d3) //双行线
- {
- G[d2].push_back({d1,d4,d5});
- }
- }
- vector<int> vec,vec1;
- int start,ending;
- cin>>start>>ending;
- dij2(start); //时间+距离
- int pos=ending;
- while(pos!=-) vec.push_back(pos),pos=pre[pos]; //vec为时间的
- dij1(start); //距离+节点
- pos=ending;
- while(pos!=-) vec1.push_back(pos),pos=pre[pos];
- if(vec.size()!=vec1.size())
- {
- cout << "Time = " << sum[ending] <<": ";
- printff(vec);
- cout << "Distance = " << dis[ending] <<": ";
- printff(vec1);
- }
- else
- {
- int zhi=judge(vec,vec1); //0不相等 1相等
- if(zhi==)
- cout<<"Time = "<<sum[ending]<<"; "<<"Distance = "<<dis[ending]<<": ",printff(vec);
- else
- {
- cout << "Time = " << sum[ending] <<": ";
- printff(vec);
- cout << "Distance = " << dis[ending] <<": ";
- printff(vec1);
- }
- }
- return ;
- }
PTA天梯地图的更多相关文章
- pta 天梯地图 (Dijkstra)
本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...
- PTA天梯 L3-007 天梯地图
L3-007 天梯地图 题目: 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地 ...
- L3-007. 天梯地图
L3-007. 天梯地图 题目链接:https://www.patest.cn/contests/gplt/L3-007 Dijstra 这题是Dijstra的变形,麻烦的是两种最短路的相同距离时的选 ...
- CCCC L2-001 紧急救援 floyd改的dijkstra模板 (记录路径) L3 天梯地图
https://www.patest.cn/contests/gplt/L2-001 题解:求最短路的条数,并输出点的权值最大的路径,用priority_queue会wa两个点,原因不明. 于是又学了 ...
- pat 团体天梯赛 L3-007. 天梯地图
L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...
- PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)
L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...
- pta l3-7(天梯地图)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 题意:给定n个地点,m条边以及边的 ...
- PAT L3-007 天梯地图
https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 本题要求你实现一个天梯赛专属在线地图,队员输 ...
- L3-007 天梯地图 (30 分) dijkstra
本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...
随机推荐
- hdu 3068 最长回文(manacher&最长回文子串)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Windows下使用mklink命令参数介绍
Windows下创建符号链接使用命令mklink常用参数有 /D /J,两者有比较明显的区别 区别1:创建/D 创建目录符号链接(即目录快捷方式)而不是文件符号链接(默认为文件符号链接),可以使用相对 ...
- ImageMagick 转换图片格式
[root@ drawable-hdpi-v4]# convert ic_launcher.jpeg ic_launcher.png [root@ drawable-hdpi-v4]# file ic ...
- SQL获取当前时间月份为两位数
--获取当前时间月份为两位数 )),) --获取当前时间上月月份为两位数 , )),)
- redhat 7.5 更换 yum源
因为 redhat 的 yum 是收费,所以需要换成 Centos 的 yum 才可以 首先,卸载 redhat 的 yum 软件 sudo rpm -qa|grep yum 其次,下载 Centos ...
- halcon 动态阈值分割之偏移值
- MySQL yum 在线与本地包方式安装
以下实践操作是在 liux-centos7 上安装配置 先检测是否安装mysql,然后在拆卸mysql # 检测[root@localhost ~]# yum list installed | gr ...
- C#GDI+ 绘制线段(实线或虚线)、矩形、字符串、圆、椭圆
C#GDI+ 绘制线段(实线或虚线).矩形.字符串.圆.椭圆 绘制基本线条和图形 比较简单,直接看代码. Graphics graphics = e.Graphics; //绘制实线 )) { pen ...
- Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
extends:http://www.cnblogs.com/tianzhijiexian/p/4087917.html 本文是对API中的方法做了介绍,如果想要看如何让这些方法兼容4.x或2.x可以 ...
- IntelliJ IDEA 改变默认的签名 Administrator
/** * Created with IntelliJ IDEA. * User: Administrator * Date: 12-8-27 * Time: 下午11:29 * To change ...