layout: post

title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

author: "luowentaoaa"

catalog: true

mathjax: true

tags:

- 最短路

- Dijkstra

- 图论

- 训练指南


Airport Express

UVA - 11374

题意

机场快线有经济线和商业线,现在分别给出经济线和商业线的的路线,现在只能坐一站商业线,其他坐经济线,问从起点到终点的最短用时是多少,还有路线是怎样的;

题解

预处理出起点到所有站的最短距离和终点到所有站的最短距离,枚举要坐的那趟商业线,然后里面最小的就是答案了;

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll mod=998244353;
  5. const int maxn=550;
  6. const ll inf=0x3f3f3f3f3f3f3f3fLL;
  7. struct Edge{
  8. int from,to,dist;
  9. };
  10. struct HeapNode{
  11. int d,u;
  12. bool operator <(const HeapNode& rhs)const{
  13. return d>rhs.d;
  14. }
  15. };
  16. struct Dijkstra{
  17. int n,m; //点数和边数 点编号0~N-1
  18. vector<Edge>edges;
  19. vector<int>G[maxn];
  20. bool done[maxn];
  21. int d[maxn];
  22. int p[maxn];
  23. void init(int n){
  24. this->n=n;
  25. for(int i=0;i<n;i++)G[i].clear();
  26. edges.clear();
  27. }
  28. void AddEdge(int from,int to,int dist){
  29. edges.push_back((Edge){from,to,dist});
  30. m=edges.size();
  31. G[from].push_back(m-1);
  32. }
  33. void dijkstra(int s){
  34. priority_queue<HeapNode>Q;
  35. for(int i=0;i<n;i++)d[i]=inf;
  36. d[s]=0;
  37. memset(done,0,sizeof(done));
  38. Q.push((HeapNode){0,s});
  39. while(!Q.empty()){
  40. HeapNode x=Q.top();Q.pop();
  41. int u=x.u;
  42. if(done[u])continue;
  43. done[u]=true;
  44. for(int i=0;i<G[u].size();i++){
  45. Edge& e=edges[G[u][i]];
  46. if(d[e.to]>d[u]+e.dist){
  47. d[e.to]=d[u]+e.dist;
  48. p[e.to]=G[u][i];
  49. Q.push((HeapNode){d[e.to],e.to});
  50. }
  51. }
  52. }
  53. }
  54. void GetShortestPaths(int s,int* dist,vector<int>* paths){//paths是二维链表
  55. dijkstra(s);
  56. for(int i=0;i<n;i++){
  57. dist[i]=d[i];
  58. paths[i].clear();
  59. int t=i;
  60. paths[i].push_back(t);
  61. while(t!=s){
  62. paths[i].push_back(edges[p[t]].from);
  63. t=edges[p[t]].from;
  64. }
  65. reverse(paths[i].begin(),paths[i].end());
  66. }
  67. }
  68. };
  69. Dijkstra solver;
  70. int d1[maxn],d2[maxn];
  71. vector<int>paths1[maxn],paths2[maxn];
  72. int main()
  73. {
  74. // std::ios::sync_with_stdio(false);
  75. // std::cin.tie(0);
  76. // std::cout.tie(0);
  77. int kase=0,N,S,E,M,K,X,Y,Z;
  78. while(scanf("%d%d%d%d", &N, &S, &E, &M) == 4) {
  79. solver.init(N);
  80. S--;E--;
  81. for(int i=0;i<M;i++){
  82. scanf("%d%d%d", &X, &Y, &Z); X--; Y--;
  83. solver.AddEdge(X,Y,Z);
  84. solver.AddEdge(Y,X,Z);
  85. }
  86. solver.GetShortestPaths(S,d1,paths1);
  87. solver.GetShortestPaths(E,d2,paths2);
  88. int ans=d1[E];
  89. vector<int>path=paths1[E];
  90. int midpoint=-1;
  91. scanf("%d", &K);
  92. for(int i=0;i<K;i++){
  93. scanf("%d%d%d", &X, &Y, &Z); X--; Y--;
  94. for(int j=0;j<2;j++){
  95. if(d1[X]+d2[Y]+Z<ans){
  96. ans=d1[X]+d2[Y]+Z;
  97. path=paths1[X];
  98. for(int p=paths2[Y].size()-1;p>=0;p--)
  99. path.push_back(paths2[Y][p]);
  100. midpoint=X;
  101. }
  102. swap(X,Y);
  103. }
  104. }
  105. if(kase != 0) printf("\n");
  106. kase++;
  107. for(int i = 0; i < path.size()-1; i++) printf("%d ", path[i]+1);
  108. printf("%d\n", E+1);
  109. if(midpoint == -1) printf("Ticket Not Used\n"); else printf("%d\n", midpoint+1);
  110. printf("%d\n", ans);
  111. }
  112. return 0;
  113. }

训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)的更多相关文章

  1. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  2. 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)

    layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...

  3. 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)

    layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...

  4. 训练指南 UVA - 11419(二分图最小覆盖数)

    layout: post title: 训练指南 UVA - 11419(二分图最小覆盖数) author: "luowentaoaa" catalog: true mathjax ...

  5. 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y))

    layout: post title: 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y)) author: "luowentaoaa" cata ...

  6. 训练指南 UVA - 11354(最小生成树 + 倍增LCA)

    layout: post title: 训练指南 UVA - 11354(最小生成树 + 倍增LCA) author: "luowentaoaa" catalog: true ma ...

  7. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

  8. uva 11374 最短路+记录路径 dijkstra最短路模板

    UVA - 11374 Airport Express Time Limit:1000MS   Memory Limit:Unknown   64bit IO Format:%lld & %l ...

  9. 算法竞赛入门经典训练指南——UVA 11300 preading the Wealth

    A Communist regime is trying to redistribute wealth in a village. They have have decided to sit ever ...

随机推荐

  1. P4754 True Vegetable

    题目描述 小A现在有 NN 道题,编号为 1,2,\cdots,N1,2,⋯,N .每道题的起始毒瘤程度为 00 或 11 .在每回合,小A可以将编号连续的 KK 道题的毒瘤程度+1.但小B因为本身比 ...

  2. ZJOI2018 Day2 滚粗记 + 流水账

    一脸懵逼地就被直接拉过来浙江省选了,一年参加两次省选成就达成-- 讲课啥的都没听,过去休息了一天就进行比赛了.考试之前感冒没好透,精神不是 \(100\%\) 的状态,但是并无大碍(反正最后都很凉). ...

  3. Winpcap网络开发库入门

    原文链接地址:http://www.cnblogs.com/phinecos/archive/2008/10/20/1315176.html Winpcap是一个强大的网络开发库,可以实现许多功能:获 ...

  4. 普通table表格样式及代码大全

     普通table表格样式及代码大全(全)(一) 单实线边框表格 <table style="border-collapse: collapse" borderColor=#0 ...

  5. ICE学习笔记一----运行官方的java版demo程序

    建议新手和我一样,从官网下载英文文档,开个有道词典,慢慢啃. 官方文档下载: http://download.csdn.net/detail/xiong_mao_1/6300631 程序代码就不说了, ...

  6. Linux动态库生成以及调用

    Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件. 在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是 ...

  7. BZoj 1003 物流运输 DP+最短路

    2013-09-11 09:56 W[I]代表前I天能取得的最小花费,假设在第J天更改一次路线,那么如果有 W[I]>W[J]+第j+1到第I天的最小花费+更改路线的花费(K) 那么更新W[I] ...

  8. Type of flip id

    http://www.haskell.org/pipermail/beginners/2011-March/006477.html The point is that the type of id h ...

  9. guake 3.4发布,支持切分窗口

    guake是一款下拉式终端,美观实用. 近日发布了3.4版本,在3.4版本中支持了切分窗口功能.如图所示,还是比较实用的一个功能. 目前ubuntu仓库中还未更新,需要使用pip安装,或者自行从源码编 ...

  10. python 学习笔记 多进程

    要让python程序实现多进程,我们先了解操作系统的相关知识 Unix/Linux操作系统提供了一个fork()系统调用,他非常特殊,普通的函数调用,调用一次,返回一次,但是fork调用一次, 返回两 ...