明天就要考PAT,为了应付期末已经好久没有刷题了啊啊啊啊,今天开了一道最短路,状态不是很好

1.没有读清题目要求,或者说没有读完题目,明天一定要注意

2.vis初始化的时候从1初始化到n,应该从0开始,以后初始化就从0到n即可

题目大意:给一张地图,两个结点中既有距离也有时间,有的单行有的双向,要求根据地图推荐两条路线:一条是最快到达路线,一条是最短距离的路线。

第一行给出两个整数N和M,表示地图中地点的个数和路径的条数。接下来的M行每一行给出:道路结点编号V1 道路结点编号V2 是否单行线 道路长度 所需时间

要求第一行输出最快到达时间Time和路径,第二行输出最短距离Distance和路径

就用两次dij+dfs即可,好嘛,今晚dfs也不用练了.最好明天出一道这道题

  1. #include <iostream>
  2. #include<bits/stdc++.h>
  3. #define each(a,b,c) for(int a=b;a<=c;a++)
  4. #define de(x) cout<<#x<<" "<<(x)<<endl
  5. using namespace std;
  6. const int maxn=500+5;
  7. const int inf=0x3f3f3f3f;
  8. int T[maxn][maxn];
  9. int dis1[maxn];
  10. int dis2[maxn];
  11. bool vis[maxn];
  12. int n,m,from,to;
  13. vector<int>pre1[maxn],pre2[maxn];
  14. /// vis =0 从0开始
  15. struct edge
  16. {
  17. int v;
  18. int length;
  19. int time;
  20. edge(int v,int length,int time):v(v),length(length),time(time){}
  21. };
  22. vector<edge>G[maxn];
  23. struct node
  24. {
  25. int v;
  26. int len;
  27. node(int v=0,int len=0):v(v),len(len){}
  28. bool operator<(const node&r)const
  29. {
  30. return len>r.len;
  31. }
  32. };
  33. void dijkstra1(int start,int n)
  34. {
  35. for(int i=0;i<=n;i++)
  36. {
  37. vis[i]=false;
  38. dis1[i]=inf;
  39. }
  40. dis1[start]=0;
  41. priority_queue<node>Q;
  42. Q.push(node(start,0));
  43. node temp;
  44. while(!Q.empty())
  45. {
  46. temp=Q.top();
  47. Q.pop();
  48. int u=temp.v;
  49. if(vis[u])continue;
  50. vis[u]=true;
  51. for(int i=0;i<G[u].size();i++)
  52. {
  53. int v=G[u][i].v;
  54. int len=G[u][i].length;
  55. if(!vis[v]&&dis1[v]>dis1[u]+len)
  56. {
  57. dis1[v]=dis1[u]+len;
  58. pre1[v].clear();
  59. pre1[v].push_back(u);
  60. Q.push(node(v,dis1[v]));
  61. }
  62. else if(!vis[v]&&dis1[v]==dis1[u]+len)
  63. {
  64. pre1[v].push_back(u);
  65. }
  66. }
  67. }
  68. }
  69. void dijkstra2(int start,int n)
  70. {
  71. for(int i=0;i<=n;i++)
  72. {
  73. vis[i]=false;
  74. dis2[i]=inf;
  75. }
  76. dis2[start]=0;
  77. priority_queue<node>Q;
  78. while(!Q.empty())Q.pop();
  79. Q.push(node(start,0));
  80. node temp;
  81. while(!Q.empty())
  82. {
  83. temp=Q.top();
  84. Q.pop();
  85. int u=temp.v;
  86. if(vis[u])continue;
  87. vis[u]=true;
  88. for(int i=0;i<G[u].size();i++)
  89. {
  90. int v=G[u][i].v;
  91. int len=G[u][i].time;
  92. if(!vis[v]&&dis2[v]>dis2[u]+len)
  93. {
  94. dis2[v]=dis2[u]+len;
  95. pre2[v].clear();
  96. pre2[v].push_back(u);
  97. Q.push(node(v,dis2[v]));
  98. }
  99. else if(!vis[v]&&dis2[v]==dis2[u]+len)
  100. {
  101. pre2[v].push_back(u);
  102. }
  103. }
  104. }
  105. }
  106. vector<int>path;
  107. vector<int>ans_path;
  108. vector<int>ans_path2;
  109. int min_time=inf;
  110. void dfs1(int v)
  111. {
  112. path.push_back(v);
  113. if(v==from)
  114. {
  115. int temp=0;
  116. for(int i=0;i<path.size()-1;i++)
  117. {
  118. temp+=T[path[i+1]][path[i]];
  119. }
  120. if(temp<min_time)
  121. {
  122. min_time=temp;///忘记更新最小值了\吐血
  123. ans_path=path;
  124. }
  125. path.pop_back();
  126. return ;
  127. }
  128. for(int i=0;i<pre1[v].size();i++)
  129. {
  130. dfs1(pre1[v][i]);
  131. }
  132. path.pop_back();
  133. }
  134. int max_n=maxn;
  135. void dfs2(int v)
  136. {
  137. path.push_back(v);
  138. if(v==from)
  139. {
  140. if(path.size()<max_n)
  141. {
  142. max_n=path.size();
  143. ans_path2=path;
  144. }
  145. path.pop_back();
  146. return;
  147. }
  148. for(int i=0;i<pre2[v].size();i++)
  149. {
  150. dfs2(pre2[v][i]);
  151. }
  152. path.pop_back();
  153. }
  154. /*
  155. V1 V2 one-way length time
  156. 10 15
  157. 0 1 0 1 1
  158. 8 0 0 1 1
  159. 4 8 1 1 1
  160. 3 4 0 3 2
  161. 3 9 1 4 1
  162. 0 6 0 1 1
  163. 7 5 1 2 1
  164. 8 5 1 2 1
  165. 2 3 0 2 2
  166. 2 1 1 1 1
  167. 1 3 0 3 1
  168. 1 4 0 1 1
  169. 9 7 1 3 1
  170. 5 1 0 5 2
  171. 6 5 1 1 2
  172. 3 5
  173. */
  174. int main()
  175. {
  176. cin>>n>>m;
  177. int v1,v2,flag,len,time;
  178. each(i,1,m)
  179. {
  180. cin>>v1>>v2>>flag>>len>>time;
  181. if(flag==1)
  182. {
  183. G[v1].push_back(edge(v2,len,time));
  184. T[v1][v2]=T[v2][v1]=time;
  185. }
  186. else
  187. {
  188. G[v1].push_back(edge(v2,len,time));
  189. G[v2].push_back(edge(v1,len,time));
  190. T[v1][v2]=T[v2][v1]=time;
  191. }
  192. }
  193. cin>>from>>to;
  194. dijkstra1(from,n);
  195. dijkstra2(from,n);
  196. //de(dis1[to]);
  197. //de(dis2[to]);
  198. dfs1(to);
  199. dfs2(to);
  200. printf("Distance = %d", dis1[to]);
  201. if(ans_path == ans_path2) {
  202. printf("; Time = %d: ", dis2[to]);
  203. } else {
  204. printf(": ");
  205. for(int i = ans_path.size() - 1; i >= 0; i--) {
  206. printf("%d", ans_path[i]);
  207. if(i != 0) printf(" -> ");
  208. }
  209. printf("\nTime = %d: ", dis2[to]);
  210. }
  211. for(int i = ans_path2.size() - 1; i >= 0; i--) {
  212. printf("%d", ans_path2[i]);
  213. if(i != 0) printf(" -> ");
  214. }
  215. /*
  216. Distance = 6: 3 -> 4 -> 8 -> 5
  217. Time = 3: 3 -> 1 -> 5
  218. */
  219. }

PAT-1111 Online Map (30分) 最短路+dfs的更多相关文章

  1. 【PAT甲级】1111 Online Map (30分)(dijkstra+路径记录)

    题意: 输入两个正整数N和M(N<=500,M<=N^2),分别代表点数和边数.接着输入M行每行包括一条边的两个结点(0~N-1),这条路的长度和通过这条路所需要的时间.接着输入两个整数表 ...

  2. PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS

    PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...

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

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

  4. PAT 1004 Counting Leaves (30分)

    1004 Counting Leaves (30分) A family hierarchy is usually presented by a pedigree tree. Your job is t ...

  5. [PAT] 1147 Heaps(30 分)

    1147 Heaps(30 分) In computer science, a heap is a specialized tree-based data structure that satisfi ...

  6. PAT 甲级 1147 Heaps (30 分) (层序遍历,如何建树,后序输出,还有更简单的方法~)

    1147 Heaps (30 分)   In computer science, a heap is a specialized tree-based data structure that sati ...

  7. PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****

    1057 Stack (30 分)   Stack is one of the most fundamental data structures, which is based on the prin ...

  8. PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)

    1018 Public Bike Management (30 分)   There is a public bike service in Hangzhou City which provides ...

  9. PTA 1004 Counting Leaves (30)(30 分)(dfs或者bfs)

    1004 Counting Leaves (30)(30 分) A family hierarchy is usually presented by a pedigree tree. Your job ...

随机推荐

  1. Communications link failure due to underlying exception: ** BEGIN NESTED EXC

    一是将 wait_timeout=31536000 interactive_timeout=31536000 将过期时间修改为1年. 二是在连接URL上添加参数:&autoReconnect= ...

  2. Eclipse 搭建Struts2

    Eclipse版本 Mars Release (4.5.0) Struts版本 struts-2.5.20 下载地址:https://struts.apache.org/download.cgi#st ...

  3. IDEA一些自动补全方式

    第一种:系统自带:可以CTRL + j 可以查看 psvm 也就是public static void main的首字母. 依次还有在方法体内键入for会有一个fori的提示,选中然后tab键,就会自 ...

  4. c++ 网络编程基础

    目录 c++ 网络编程 建立socket 绑定socket 建立连接 监听 服务器端接收 数据发送和接收 面向连接的数据发送 面向连接的数据接收 无连接的数据发送 无连接的数据接收 关闭socket ...

  5. ISO/IEC 9899:2011 条款6.5.5——乘法操作符

    6.5.5 乘法操作符 语法 1.multiplicative-expression: cast-expression multiplicative-expression    *    cast-e ...

  6. 004-行为型-03-观察者模式(Observer)

    一.概述 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象. 定义了对象之间的一对多依赖,让多个观察者对象同时监听某一 ...

  7. C++类const和static成员初始化

    class A{ private: int a; //变量,属于对象任何地方初始化即可 ; //常量,属于对象,声明的时候初始化.在构造函数初始化列表初始化,最后取初始化列表的值 static int ...

  8. Spring Boot应用的打包和部署

    传统的Web应用在发布之前通常会打成WAR包,然后将WAR包部署到Tomcat等容器中使用,而通过前面的学习我们已经知道,Spring Boot应用既能以JAR包的形式部署,又能以WAR包的形式部署. ...

  9. [ jenkins ] 基础安装及权限管理

    1. 安装 jenkins 在安装 jenkins 之前需要 java 的支持 (1)安装 jdk1.8 [root@192.168.118.17 ~]#tar xf jdk-8u77-linux-x ...

  10. Django 之安全篇

    一.CSRF攻击 CSRF攻击概述: CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其 ...