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

输入格式:

输入在第一行给出两个正整数N(2 ≤ N ≤ 500)和M,分别为地图中所有标记地点的个数和连接地点的道路条数。随后M行,每行按如下格式给出一条道路的信息:

  1. V1 V2 one-way length time

其中V1V2是道路的两个端点的编号(从0到N-1);如果该道路是从V1V2的单行线,则one-way为1,否则为0;length是道路的长度;time是通过该路所需要的时间。最后给出一对起点和终点的编号。

输出格式:

首先按下列格式输出最快到达的时间T和用节点编号表示的路线:

  1. Time = T: 起点 => 节点1 => ... => 终点

然后在下一行按下列格式输出最短距离D和用节点编号表示的路线:

  1. Distance = D: 起点 => 节点1 => ... => 终点

如果最快到达路线不唯一,则输出几条最快路线中最短的那条,题目保证这条路线是唯一的。而如果最短距离的路线不唯一,则输出途径节点数最少的那条,题目保证这条路线是唯一的。

如果这两条路线是完全一样的,则按下列格式输出:

  1. Time = T; Distance = D: 起点 => 节点1 => ... => 终点

输入样例1:

  1. 10 15
  2. 0 1 0 1 1
  3. 8 0 0 1 1
  4. 4 8 1 1 1
  5. 5 4 0 2 3
  6. 5 9 1 1 4
  7. 0 6 0 1 1
  8. 7 3 1 1 2
  9. 8 3 1 1 2
  10. 2 5 0 2 2
  11. 2 1 1 1 1
  12. 1 5 0 1 3
  13. 1 4 0 1 1
  14. 9 7 1 1 3
  15. 3 1 0 2 5
  16. 6 3 1 2 1
  17. 5 3

输出样例1:

  1. Time = 6: 5 => 4 => 8 => 3
  2. Distance = 3: 5 => 1 => 3

输入样例2:

  1. 7 9
  2. 0 4 1 1 1
  3. 1 6 1 3 1
  4. 2 6 1 1 1
  5. 2 5 1 2 2
  6. 3 0 0 1 1
  7. 3 1 1 3 1
  8. 3 2 1 2 1
  9. 4 5 0 2 2
  10. 6 5 1 2 1
  11. 3 5

输出样例2:

  1. Time = 3; Distance = 4: 3 => 2 => 5
  2. 解题思路:当时建图的时候把距离搞成了点的距离,和城市间紧急救援搞混了,看了一晚上自己的代码都没看出来,最后请教了Bob才知道,大佬的博客https://www.cnblogs.com/BobHuang/
    菜鸡的成长史 ^_^
    代码有点乱等以后来改进
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=,INF=0x3f3f3f3f;
  4. int n,m;
  5. struct edg
  6. {
  7. int B,J,S;
  8. }E1,E2; //存边的信息,因为这个一条边有3个信息
  9. vector<edg>G[N],T[N];
  10. int dis[N],pre[N],vis[N],in[N],num[N],out[N];
  11. int diss[N],sum[N];
  12. struct Node
  13. {
  14. int B,J;
  15. bool operator <(const Node&x)const{
  16. return x.J<J;
  17. }
  18. }p,q;
  19. void printff(vector<int> vec)
  20. {
  21. int flag=;
  22. for(int i=vec.size()-;i>=;i--)
  23. {
  24. if(flag) cout << " => ";
  25. cout << vec[i],flag=;
  26. }
  27. cout << endl;
  28. }
  29. int judge(vector<int>vec,vector<int>vec1)
  30. {
  31. for(int i=;i<vec.size();i++)
  32. if(vec[i]!=vec1[i]) return ; //不相等就退出
  33. return ;
  34. }
  35. void dij1(int start)
  36. {
  37. priority_queue<Node> que;
  38. for(int i=;i<=N-;i++) dis[i]=INF,pre[i]=-,vis[i]=;
  39. que.push({start,}),dis[start]=,num[start]=;
  40. while(!que.empty())
  41. {
  42. p=que.top(),que.pop();
  43. int u=p.B,v,w,z;
  44. if(vis[u]) continue;
  45. vis[u]=;
  46. for(auto X:G[u])
  47. {
  48. v=X.B,w=X.J,z=;
  49. if(dis[v]>w+p.J)
  50. dis[v]=w+p.J,pre[v]=u,num[v]=num[u]+,q.B=v,q.J=dis[v],que.push(q);
  51. else if(dis[v]==w+p.J)
  52. {
  53. if(num[v]>num[u]+) //节点数取小的
  54. num[v]=num[u]+,pre[v]=u;
  55. }
  56. }
  57. }
  58. }
  59. void dij2(int start) //时间加距离
  60. {
  61. priority_queue<Node> que;
  62. for(int i=;i<=N-;i++) pre[i]=-,vis[i]=,sum[i]=INF,diss[i]=;
  63. que.push({start,}),diss[start]=,sum[start]=; //自己到自己的距离和时间都为0
  64. while(!que.empty())
  65. {
  66. p=que.top(),que.pop();
  67. int u=p.B,v,w,z;
  68. if(vis[u]) continue;
  69. vis[u]=;
  70. for(auto X:G[u])
  71. {
  72. v=X.B,w=X.J,z=X.S; //压入的是时间
  73. if(sum[v]>z+p.J)
  74. sum[v]=z+p.J,pre[v]=u,diss[v]=diss[u]+w,q.B=v,q.J=sum[v],que.push(q);
  75. else if(sum[v]==z+p.J)
  76. {
  77. if(diss[v]>diss[u]+w) //节点数取小的
  78. diss[v]=diss[u]+w,pre[v]=u;
  79. }
  80. }
  81. }
  82. }
  83.  
  84. int main()
  85. {
  86. ios::sync_with_stdio(false);
  87. cin>>n>>m;
  88. for(int i=,d1,d2,d3,d4,d5;i<m;i++)
  89. {
  90. cin>>d1>>d2>>d3>>d4>>d5;
  91. G[d1].push_back({d2,d4,d5}); //G 最短中最快
  92. if(!d3) //双行线
  93. {
  94. G[d2].push_back({d1,d4,d5});
  95. }
  96. }
  97. vector<int> vec,vec1;
  98. int start,ending;
  99. cin>>start>>ending;
  100. dij2(start); //时间+距离
  101. int pos=ending;
  102. while(pos!=-) vec.push_back(pos),pos=pre[pos]; //vec为时间的
  103. dij1(start); //距离+节点
  104. pos=ending;
  105. while(pos!=-) vec1.push_back(pos),pos=pre[pos];
  106. if(vec.size()!=vec1.size())
  107. {
  108. cout << "Time = " << sum[ending] <<": ";
  109. printff(vec);
  110. cout << "Distance = " << dis[ending] <<": ";
  111. printff(vec1);
  112. }
  113. else
  114. {
  115. int zhi=judge(vec,vec1); //0不相等 1相等
  116. if(zhi==)
  117. cout<<"Time = "<<sum[ending]<<"; "<<"Distance = "<<dis[ending]<<": ",printff(vec);
  118. else
  119. {
  120. cout << "Time = " << sum[ending] <<": ";
  121. printff(vec);
  122. cout << "Distance = " << dis[ending] <<": ";
  123. printff(vec1);
  124. }
  125. }
  126. return ;
  127. }

PTA天梯地图的更多相关文章

  1. pta 天梯地图 (Dijkstra)

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

  2. PTA天梯 L3-007 天梯地图

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

  3. L3-007. 天梯地图

    L3-007. 天梯地图 题目链接:https://www.patest.cn/contests/gplt/L3-007 Dijstra 这题是Dijstra的变形,麻烦的是两种最短路的相同距离时的选 ...

  4. CCCC L2-001 紧急救援 floyd改的dijkstra模板 (记录路径) L3 天梯地图

    https://www.patest.cn/contests/gplt/L2-001 题解:求最短路的条数,并输出点的权值最大的路径,用priority_queue会wa两个点,原因不明. 于是又学了 ...

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

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

  6. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

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

  7. pta l3-7(天梯地图)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 题意:给定n个地点,m条边以及边的 ...

  8. PAT L3-007 天梯地图

    https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 本题要求你实现一个天梯赛专属在线地图,队员输 ...

  9. L3-007 天梯地图 (30 分) dijkstra

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

随机推荐

  1. hdu 3068 最长回文(manacher&amp;最长回文子串)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. Windows下使用mklink命令参数介绍

    Windows下创建符号链接使用命令mklink常用参数有 /D /J,两者有比较明显的区别 区别1:创建/D 创建目录符号链接(即目录快捷方式)而不是文件符号链接(默认为文件符号链接),可以使用相对 ...

  3. ImageMagick 转换图片格式

    [root@ drawable-hdpi-v4]# convert ic_launcher.jpeg ic_launcher.png [root@ drawable-hdpi-v4]# file ic ...

  4. SQL获取当前时间月份为两位数

    --获取当前时间月份为两位数 )),) --获取当前时间上月月份为两位数 , )),)

  5. redhat 7.5 更换 yum源

    因为 redhat 的 yum 是收费,所以需要换成 Centos 的 yum 才可以 首先,卸载 redhat 的 yum 软件 sudo rpm -qa|grep yum 其次,下载 Centos ...

  6. halcon 动态阈值分割之偏移值

  7. MySQL yum 在线与本地包方式安装

     以下实践操作是在 liux-centos7 上安装配置 先检测是否安装mysql,然后在拆卸mysql # 检测[root@localhost ~]# yum list installed | gr ...

  8. C#GDI+ 绘制线段(实线或虚线)、矩形、字符串、圆、椭圆

    C#GDI+ 绘制线段(实线或虚线).矩形.字符串.圆.椭圆 绘制基本线条和图形 比较简单,直接看代码. Graphics graphics = e.Graphics; //绘制实线 )) { pen ...

  9. Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat

    extends:http://www.cnblogs.com/tianzhijiexian/p/4087917.html 本文是对API中的方法做了介绍,如果想要看如何让这些方法兼容4.x或2.x可以 ...

  10. IntelliJ IDEA 改变默认的签名 Administrator

    /** * Created with IntelliJ IDEA. * User: Administrator * Date: 12-8-27 * Time: 下午11:29 * To change ...