L3-007 天梯地图

题目:

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

输入格式:

输入在第一行给出两个正整数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

解题思路:

首先是建图,然后求两次最短路径。

因为求最快的路时要用到最短的路,所以先求最短的路,再求最快的路。

用pre记录每个节点的上一个节点来记录路径。

用到的是 图的最短路径算法,这里用的是dijkstra算法。

代码:

起点Start,Len[k]表示从start到k的最短路径,用preL[k]记录k的前驱点。

根据题意,变异dijkstra算法:如果最快到达路线不唯一,则输出几条最快路线中最短的那条。如果最短距离的路线不唯一,则输出途径节点数最少的那条。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <stack>
  4. #include <iostream>
  5. #include <algorithm>
  6. #define N 505
  7. using namespace std;
  8.  
  9. int maxint = ;
  10. int n, Start, End, i, j;
  11. bool vis[N]; //标记是否访问过
  12. int mapL[N][N]; //记录距离的伴随矩阵
  13. int mapT[N][N]; //记录时间的伴随矩阵
  14. int Len[N]; //Start到k 的最短距离
  15. int Time[N]; //Start到k 的最少时间
  16. int preL[N]; //最短距离路径前驱
  17. int preT[N]; //最少时间路径前驱
  18.  
  19. //Dijstra算法求最短距离,修改后以符合题意
  20. void Dijstra_Len(){
  21. int step[N];
  22. memset(step, , sizeof(step));
  23. step[Start] = ;
  24. //step记录节点数
  25. memset(vis, , sizeof(vis));
  26. Len[Start] = ;
  27. while(){
  28. int minl = maxint, k;
  29. //在没有被访问过的点中找一个顶点k,使len[k]最小
  30. for(i = ;i < n; i++){
  31. if(vis[i] && minl > Len[i]){
  32. minl = Len[i];
  33. k = i;
  34. }
  35. }
  36. //如果所有点都已经访问过,则结束遍历
  37. if(minl == maxint)break;
  38. //顶点k 标记为已确定(start 到达k 的最短路径)
  39. vis[k] = ;
  40. //遍历与k 相连的每个未确定最短路径的顶点j
  41. for(i = ;i < n; i++){
  42. int d = Len[k] + mapL[k][i];
  43. if(vis[i] && Len[i] > d){
  44. Len[i] = d;
  45. preL[i] = k;
  46. step[i] = step[k]+;
  47. //当路径距离相等时,优先记录节点数少的路径
  48. }else if(vis[i] && Len[i] == d && step[k]+ < step[i]){
  49. preL[i] = k;
  50. step[i] = step[k]+;
  51. }
  52. }
  53. }
  54. }
  55.  
  56. //Dijstra算法求最少时间,修改后以符合题意
  57. void Dijstra_Time(){
  58. memset(vis, , sizeof(vis));
  59. //用于记录距离长度
  60. int dis[N];
  61. for(i = ;i < n; i++)
  62. dis[i] = mapL[Start][i];
  63. Time[Start] = ;
  64. dis[Start] = ;
  65. while(){
  66. int minl = maxint, k;
  67. for(i = ;i < n; i++){
  68. if(vis[i] && minl > Time[i]){
  69. minl = Time[i];
  70. k = i;
  71. }
  72. }
  73. if(minl == maxint)break;
  74. vis[k] = ;
  75. for(i = ;i < n; i++){
  76. int t = Time[k]+mapT[k][i];
  77. int d = dis[k]+mapL[k][i];
  78. if(vis[i] && Time[i] > t){
  79. dis[i] = d;
  80. Time[i] = t;
  81. preT[i] = k;
  82. //当时间相同时,保存其中距离最短的
  83. }else if(vis[i] && Time[i] == t && dis[i] > d){
  84. dis[i] = d;
  85. preT[i] = k;
  86. }
  87. }
  88. }
  89. }
  90.  
  91. int main(){
  92. memset(preL, -, sizeof(preL));
  93. memset(preT, -, sizeof(preT));
  94. int m;
  95. cin >> n >> m;
  96. for(i = ;i < n; i++){
  97. Len[i] = maxint;
  98. Time[i] = maxint;
  99. for(int j = ;j < n;++j){
  100. mapL[i][j] = maxint;
  101. mapT[i][j] = maxint;
  102. }
  103. }
  104. while(m--){
  105. int x, y, t;
  106. cin >> x >> y >> t;
  107. cin >> mapL[x][y] >> mapT[x][y];
  108. if(!t){
  109. mapL[y][x] = mapL[x][y];
  110. mapT[y][x] = mapT[x][y];
  111. }
  112. }
  113. cin >> Start >> End;
  114. Dijstra_Len();
  115. Dijstra_Time();
  116. //取出前驱节点里保存的路径,装入stack中
  117. stack<int> bestT, bestL;
  118. i = End;
  119. while(i != Start){
  120. bestT.push(i);
  121. i = preT[i];
  122. }
  123. i = End;
  124. while(i != Start){
  125. bestL.push(i);
  126. i = preL[i];
  127. }
  128. //按题意要求输出
  129. if(bestL == bestT){
  130. printf("Time = %d; Distance = %d: %d",Time[End], Len[End], Start);
  131. while(!bestL.empty()){
  132. int t = bestL.top();
  133. cout << " => " << t;
  134. bestL.pop();
  135. }cout << endl;
  136. }else {
  137. cout << "Time = " << Time[End] << ": " << Start;
  138. while(!bestT.empty()){
  139. int t = bestT.top();
  140. cout << " => " << t;
  141. bestT.pop();
  142. }
  143. cout << endl << "Distance = " << Len[End] << ": " << Start;
  144. while(!bestL.empty()){
  145. int t = bestL.top();
  146. cout << " => " << t;
  147. bestL.pop();
  148. }cout << endl;
  149. }
  150.  
  151. return ;
  152. }

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

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

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

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

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

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

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

  4. 团体程序设计天梯赛 L1-049. 天梯赛座位分配(测试数据+不同方法)

    Data: /*33 2 1#11 4 7 10 13 16 19 22 25 2831 33 35 37 39 41 43 45 47 4951 53 55 57 59 61 63 65 67 69 ...

  5. PAT 天梯赛 L1-049. 天梯赛座位分配 【循环】

    题目链接 https://www.patest.cn/contests/gplt/L1-049 思路 用一个二维数组来保存一个学校每个队员的座位号 然后需要判断一下 目前的座位号 与该学校当前状态下最 ...

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

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

  7. PTA天梯地图

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

  8. pta 天梯地图 (Dijkstra)

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

  9. PAT L3-007 天梯地图

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

随机推荐

  1. 玩儿虫那些事(四)—— 使用curl

    目录 一.爬一个简单的网站 二.模拟登录新浪 三.各种请求的发送 四.使用curl 五.模拟登录QQ空间 六.selenium的使用 七.phantomjs的使用 八.开源框架webmagic 九.开 ...

  2. 【转载】Sqlserver中查询窗口显示行号

    在Sqlserver中编写语句的时候,有时候因为业务逻辑比较复杂,编写的语句会比较多,此时如果编辑器中显示代码的行号,则对于我们的语句编写有很好的辅助作用.sqlserver默认未开启行号显示功能,可 ...

  3. 【转载】阿里云Windows服务器重置远程登录密码

    在使用阿里云Windows系统的云服务器的时候,有时候忘记了远程连接密码,可在浏览器上登录阿里云官网,进入ECS云服务器管理后台重置远程连接的密码,因为此步操作对于服务器安全来说关系重大,所以有时候在 ...

  4. 获取json串里的某个属性值

    string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\& ...

  5. JSJ—案例谈面向对象

    有人告诉我那里遍地都是对象——我们把所有的程序代码放在main()里面,事实上,那根本就不是面向对象的做法,在Java的面向对象中,我们也会看到类和对象的不同,以及对象是如何让你的生活更美好(至少程序 ...

  6. struts配置文件说明

    (1)DOCTYPE(文档类型),所有的struts配置文件都需要有正确的doctype. (2)<struts>是根标记元素,在其下使用<package>标签声明不同的包. ...

  7. gulp es6 转 es5

    npm install --save-dev gulp-babel babel-preset-es2015 var babel = require("gulp-babel"); / ...

  8. angularJs - cynthia娆墨旧染-响应式文章发布系统

    (0)功能 a.添加新文章 b.修改已发布文章 c.搜索已经发布的文章 d.demo链接:   http://cynthiawupore.github.io/angularJS (1)界面 a.文章列 ...

  9. canvas-a11htmlANDcanvas.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 二进制安装 kubernetes 1.12(四) - 部署 Node 节点组件

    在 master 上操作 vi /etc/profile export PATH=/opt/kubernetes/bin:$PATH source /etc/profile 将 kubelet-boo ...