PAT甲级1111. Online Map

题意:

输入我们当前的位置和目的地,一个在线地图可以推荐几条路径。现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的。确保任何请求存在路径。

输入规格:

每个输入文件包含一个测试用例。对于每种情况,

第一行给出两个正整数N(2 <= N <= 500),M分别是地图上街道交叉路口的总数和街道数。然后M行跟随,每个描述一个街道的格式:

V1 V2单程长度时间

其中V1和V2是街道两端的索引(从0到N-1);一-

方式是1,如果街道从V1到V2是单向的,或者如果没有,则为0;长度是街道的长度;时间是通过街道的时间。

最后给出一对源和目的地。

输出规格:

对于每种情况,首先打印距离为D的源到目的地的最短路径,格式如下:

距离= D:源 - > v1 - > ... - >目的地

然后在下一行打印总时间最快的路径T:

时间= T:源 - > w1 - > ... - >目的地

如果最短路径不唯一,则输出最短路径中最快的路径,这被保证是唯一的。如果最快的路径不是唯一的,

输出通过最少交叉路口的路口,这被保证是唯一的。

如果最短和最快的路径相同,请以以下格式打印一行:

距离= D;时间= T:源 - > u1 - > ... - >目的地

思路:

Dijkstra + dfs.写了一个小时,有点慢。

ac代码:

C++

  1. // pat1111.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<string>
  7. #include<algorithm>
  8. #include<queue>
  9. #include<vector>
  10. #include<cstring>
  11. #include<stdio.h>
  12. #include<map>
  13. #include<cmath>
  14. #include<unordered_map>
  15. #include<unordered_set>
  16. using namespace std;
  17. int n, m;
  18. int starting, destination;
  19. int mymap[501][501];
  20. int mytime[501][501];
  21. int visit[501];
  22. int len[501];
  23. int vec[501];
  24. int disway[501];
  25. int timeway[501];
  26. int temp[501];
  27. int short_time = -1;
  28. int time_len = -1;
  29. int dlen = 0,time_dis = 0;
  30. void Dijkstra()
  31. {
  32. int now = -1;
  33. memset(visit, 0, sizeof(visit));
  34. memset(len, -1, sizeof(len));
  35. len[starting] = 0;
  36. while (1)
  37. {
  38. now = -1;
  39. for (int i = 0; i < n; i++)
  40. {
  41. if (!visit[i] && len[i] != -1 && (now == -1 || len[i] < len[now])) now = i;
  42. }
  43. if (now == -1) break;
  44. visit[now] = 1;
  45. for (int i = 0; i < n; i++)
  46. {
  47. if (!visit[i] && mymap[now][i] && (len[i] == -1 || mymap[now][i] + len[now] < len[i] ))
  48. len[i] = mymap[now][i] + len[now];
  49. }
  50. }
  51. memset(vec, -1, sizeof(vec));
  52. memset(visit, 0, sizeof(visit));
  53. vec[starting] = 0;
  54. while (1)
  55. {
  56. now = -1;
  57. for (int i = 0; i < n; i++)
  58. {
  59. if (!visit[i] && vec[i] != -1 && (now == -1 || vec[i] < vec[now])) now = i;
  60. }
  61. if (now == -1) break;
  62. visit[now] = 1;
  63. for (int i = 0; i < n; i++)
  64. {
  65. if (!visit[i] && mytime[now][i] && (vec[i] == -1 ||mytime[now][i] + vec[now] < vec[i]))
  66. vec[i] = mytime[now][i] + vec[now];
  67. }
  68. }
  69. }
  70. void dfs(int cur, int dis, int time, int pos)
  71. {
  72. if (dis > len[destination] && time > vec[destination]) return;
  73. if (dis == len[destination] && cur == destination)
  74. {
  75. if (short_time == -1 || time < short_time)
  76. {
  77. short_time = time;
  78. dlen = pos;
  79. for (int i = 0; i < pos; i++)
  80. disway[i] = temp[i];
  81. }
  82. }
  83. if (time == vec[destination] && cur == destination)
  84. {
  85. if (time_len == -1 || pos < time_len)
  86. {
  87. time_len = pos;
  88. time_dis = dis;
  89. for (int i = 0; i < pos; i++)
  90. timeway[i] = temp[i];
  91. }
  92. }
  93. for (int i = 0; i < n; i++)
  94. {
  95. if (!visit[i] && mymap[cur][i])
  96. {
  97. temp[pos] = i;
  98. dfs(i, dis + mymap[cur][i], time + mytime[cur][i], pos + 1);
  99. }
  100. }
  101. }
  102. int main()
  103. {
  104. //input
  105. scanf("%d %d", &n, &m);
  106. int v1, v2, is_one, l, t;
  107. for (int i = 0; i < m; i++)
  108. {
  109. scanf("%d %d %d %d %d", &v1, &v2, &is_one, &l, &t);
  110. if (is_one)
  111. {
  112. mymap[v1][v2] = l;
  113. mytime[v1][v2] = t;
  114. }
  115. else
  116. {
  117. mymap[v1][v2] = mymap[v2][v1] = l;
  118. mytime[v1][v2] = mytime[v2][v1] = t;
  119. }
  120. }
  121. scanf("%d %d", &starting, &destination);
  122. Dijkstra();
  123. memset(visit, 0, sizeof(visit));
  124. //temp[0] = starting;
  125. dfs(starting,0,0,0);
  126. if (time_dis == len[destination] && short_time == vec[destination])
  127. {
  128. printf("Distance = %d; Time = %d: %d", time_dis, short_time,starting);
  129. // -> 2 -> 5"
  130. for (int i = 0; i < time_len; i++)
  131. printf(" -> %d", timeway[i]);
  132. printf("\n");
  133. }
  134. else
  135. {
  136. printf("Distance = %d: %d", len[destination], starting);
  137. for (int i = 0; i < dlen; i++)
  138. printf(" -> %d", disway[i]);
  139. printf("\n");
  140. printf("Time = %d: %d", vec[destination], starting);
  141. for (int i = 0; i < time_len; i++)
  142. printf(" -> %d", timeway[i]);
  143. printf("\n");
  144. }
  145. return 0;
  146. }

PAT甲级1111. Online Map的更多相关文章

  1. PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)

    本文章同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90041078   1111 Online Map (30 分) ...

  2. PAT甲级1131. Subway Map

    PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...

  3. PAT甲级——A1131 Subway Map【30】

    In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...

  4. PAT甲级1131 Subway Map【dfs】【输出方案】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805347523346432 题意: 告诉你一个地铁线路图,站点都是 ...

  5. PAT甲级——1131 Subway Map (30 分)

    可以转到我的CSDN查看同样的文章https://blog.csdn.net/weixin_44385565/article/details/89003683 1131 Subway Map (30  ...

  6. PAT甲级——A1111 Online Map【30】

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  7. PAT Advanced 1111 Online Map (30) [Dijkstra算法 + DFS]

    题目 Input our current position and a destination, an online map can recommend several paths. Now your ...

  8. PAT 1111 Online Map[Dijkstra][dfs]

    1111 Online Map(30 分) Input our current position and a destination, an online map can recommend seve ...

  9. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

随机推荐

  1. 如何扎实自己的Java基础?

    问:如何扎实自己的Java基础? 答:玩好JDK JDK其实就是Java SE Development Kit的缩写,要玩好这东西可不简单.JDK主要包含了三部分,第一部分就是Java运行时环境,这其 ...

  2. nvm npm node.js的关系

    nvm   npm  node.js都是用来构建reactNativ的项目 nvm管理node.j和npm版本的 node.js管理reactNative开发中所需要的代码库的 npm管理对应node ...

  3. Shell编程学习2--命令大全

    Linux中有很多的命令,这些命令可分分为10类(具体参见[1]): 1) 文件管理; 2) 文档编辑; 3) 文件传输; 4) 磁盘管理; 5) 磁盘维护; 6) 网络通讯; 7) 系统管理; 8) ...

  4. php修改文件上传大小限制

    上传一个20M文件的时候php报如下错误,是php上传文件大小限制引起 POST Content-Length of 19248654 bytes exceeds the limit of 83886 ...

  5. 2018JAVA复习摘要

    由于公司内部原因,2018年感觉自己可能会换个新环境:虽然时间尚未确定,但还是得提前做好防范,毕竟面试复习是需要时间好好准备才能拿到自己理想的offer.打算从清明节之后开始好复习基本知识要点,先整理 ...

  6. windows下redis服务操作

    安装redis服务redis-server --service-install redis.windows.conf --service-name Redis26380 --loglevel verb ...

  7. Oracle学习笔记:wm_concat函数合并字段

    在Oracle中使用wm_concat(column)可以实现字段的分组合并,逗号分隔. 例如,现有表temp_cwh_test: -- 创建临时表 create table temp_cwh_tes ...

  8. MySQL学习笔记:计算机服务中找不到MySQL服务

    不知道什么原因,连接了远程服务器之后,本地服务就连接不上. 经排查,发现服务中的MySQL服务居然不见,一番搜索之后,在CMD中进入到MySQL安装目录的bin下执行以下语句: mysqld.exe ...

  9. Ninject中调用webapi卡住的情况解决

    过年这两天在家做项目,把mvc升级到了5.1,webapi升级到了2.1,忽然发现一个问题,在某些页面上ajax调用webapi时会发现卡死现象,CPU也没有被占用,就是网页一些在加载也不报错,经过2 ...

  10. 在ASP.NET Web API和ASP.NET Web MVC中使用Ninject

    先附上源码下载地址 一.准备工作 1.新建一个名为MvcDemo的空解决方案 2.新建一个名为MvcDemo.WebUI的空MVC应用程序 3.使用NuGet安装Ninject库   二.在ASP.N ...