5-5 城市间紧急救援   (25分)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出4个正整数NN、MM、SS、DD,其中NN(2\le
N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0
~ (N-1)(N−1);MM是快速道路的条数;SS是出发地的城市编号;DD是目的地的城市编号。

第二行给出NN个正整数,其中第ii个数是第ii个城市的救援队的数目,数字间以空格分隔。随后的MM行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:

第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从SS到DD的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

  1. 4 5 0 3
  2. 20 30 40 10
  3. 0 1 1
  4. 1 3 2
  5. 0 3 3
  6. 0 2 2
  7. 2 3 2

输出样例:

  1. 2 60
  2. 0 1 3

最短路;(更新等价

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. typedef unsigned long long ULL;
  5. typedef pair<int,int>PII;
  6. const double eps=1e-5;
  7. const double pi=acos(-1.0);
  8. const int mod=1e9+7;
  9. const int INF=0x3f3f3f3f;
  10.  
  11. const int N=5e2+10;
  12.  
  13. int ma[N][N];
  14. LL ways[N];
  15. int ww[N],pre[N],ans[N],num;
  16. PII dis[N];
  17. bool vis[N];
  18. int n,m,s,t;
  19.  
  20. queue<int>q;
  21. void SPFA()
  22. {
  23. for(int i=0;i<n;i++)
  24. {
  25. ways[i]=0;
  26. vis[i]=0;
  27. dis[i].second=0;
  28. dis[i].first=INF;
  29. }
  30. pre[s]=-1;
  31. dis[s].first=0;
  32. dis[s].second=ww[s];
  33. vis[s]=1;
  34. ways[s]=1;
  35.  
  36. q.push(s);
  37. while(!q.empty())
  38. {
  39. int u=q.front();
  40. q.pop();
  41. vis[u]=0;
  42. for(int i=0;i<n;i++)
  43. {
  44. if(ma[u][i]!=INF&&i!=u)
  45. {
  46. if(dis[i].first>dis[u].first+ma[u][i])
  47. {
  48. pre[i]=u;
  49. ways[i]=ways[u];
  50. dis[i].first=dis[u].first+ma[u][i];
  51. dis[i].second=dis[u].second+ww[i];
  52. if(!vis[i])
  53. {
  54. q.push(i);
  55. vis[i]=1;
  56. }
  57. }
  58. else if(dis[i].first==dis[u].first+ma[u][i])
  59. {
  60. if(dis[i].second<dis[u].second+ww[i])
  61. {
  62. ways[i]+=ways[u];
  63. pre[i]=u;
  64. dis[i].second=dis[u].second+ww[i];
  65. if(!vis[i])
  66. {
  67. q.push(i);
  68. vis[i]=1;
  69. }
  70. }
  71. }
  72. }
  73. }
  74. }
  75. // printf("%d\n",dis[t].first);
  76. printf("%lld %d\n",ways[t],dis[t].second);
  77. int v=t;
  78. num=0;
  79. while(pre[v]!=-1)
  80. {
  81. ans[num++]=v;
  82. v=pre[v];
  83. }
  84. ans[num++]=s;
  85. printf("%d",ans[num-1]);
  86. for(int i=num-2;i>=0;i--)
  87. printf(" %d",ans[i]);
  88. }
  89.  
  90. int main()
  91. {
  92. scanf("%d%d%d%d",&n,&m,&s,&t);
  93. for(int i=0;i<n;i++)
  94. scanf("%d",&ww[i]);
  95. for(int i=0;i<n;i++)
  96. for(int j=0;j<n;j++)
  97. {
  98. if(i==j) ma[i][i]=0;
  99. else ma[i][j]=ma[j][i]=INF;
  100. }
  101. int u,v,w;
  102. while(m--)
  103. {
  104. scanf("%d%d%d",&u,&v,&w);
  105. ma[u][v]=min(ma[u][v],w);
  106. ma[v][u]=ma[u][v];
  107. }
  108. SPFA();
  109. return 0;
  110. }

5-5 城市间紧急救援 (25分)【最短路spfa】的更多相关文章

  1. PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

    PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...

  2. 城市间紧急救援(25 分)(dijstra变形)

    城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...

  3. PTA-数据结构 Dijkstra 城市间紧急救援

    城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...

  4. 天梯L2-001. 紧急救援(25分)

    L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...

  5. 城市间紧急救援 Dijkstra

    作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...

  6. PAT-1003 Emergency (25 分) 最短路最大点权+求相同cost最短路的数量

    As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...

  7. L2-001 紧急救援 (25 分)

    L2-001 紧急救援 (25 分)   作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...

  8. PTA 旅游规划(25 分)

    7-10 旅游规划(25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条 ...

  9. L2-013 红色警报 (25 分)

    L2-013 红色警报 (25 分)   战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全 ...

随机推荐

  1. 封装EF code first用存储过程的分页方法

    一年半没有做过MVC的项目了,还是很怀念(因为现在项目还是原来的ASPX),个人还是喜欢mvc,最近又开始重拾MVC,感觉既熟悉又陌生. 记录一下封装好的分页代码 首先先说下 我使用EF codefi ...

  2. IOS 单元测试

    本文转载至 http://blog.csdn.net/fengsh998/article/details/8109293 IOS 自带单元测试. 1.在创建时,将include Unit Tests钩 ...

  3. 【BZOJ4293】[PA2015]Siano 线段树

    [BZOJ4293][PA2015]Siano Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会 ...

  4. send data to Flume client-sdk flume使用之httpSource

    https://flume.apache.org/FlumeDeveloperGuide.html#client-sdk flume使用之httpSource - CSDN博客 https://blo ...

  5. Routine Subroutine Coroutine 子程序 协程

    https://en.wikipedia.org/wiki/Subroutine In computer programming, a subroutine is a sequence of prog ...

  6. ElasticSearch(八)关于document的一些知识点

    先查看一条数据: GET /ecommerce/product/5 { "_index" : "ecommerce", "_type" : ...

  7. Windows平台,开机自动运行应用

    打开注册表编辑器(Win+R后执行regedit) 进入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 新建字符串值, ...

  8. iOS 开发中的一些注意点(安全、当前语言、时间格式化)

    1.重复运行项目,不重复构建项目(来自Heath Borders) 假如你一直在不停地调试同一个问题,你可以在不重复构建的情况下运行你的APP,这样:“Product>Perform Actio ...

  9. 给第三方apk进行系统签名的几种方式【转】

    本文转载自:http://blog.csdn.net/luzhenrong45/article/details/47733053 版权声明:本文为博主原创文章,未经博主允许不得转载. -------- ...

  10. hdu1198 Farm Irrigation —— dfs or 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 dfs: #include<cstdio>//hdu1198 dfs #includ ...