城市间紧急救援(25 分)

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

输入格式:

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

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

输出格式:

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

输入样例:

4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2

输出样例:

2 60
0 1 3
#include "iostream"
using namespace std; #define Max 500
#define Sky 99999
int Graph[Max][Max],Top,Start,End,Edge;
int Dist[Max],Move[Max],Peo[Max],Sum[Max],Way[Max]; void Dis()
{
int i,j;
for(i=;i<Top;i++)
{
Dist[i]=Graph[Start][i];
Move[i]=false;
if(i!=Start && Graph[Start][i]!=Sky)
{
Sum[i]=Peo[Start]+Peo[i];
Way[i]=;
}
}
Dist[Start]=;
Move[Start]=true;
Sum[Start]=Peo[Start];
Way[Start]=; for(i=;i<=Top-;i++)
{
int minw,maxp;
minw=maxp=Sky;
int k=Start; for(j=;j<Top;j++)
{
if(!Move[j])
{
if(minw>Dist[j])
{
minw=Dist[j];
k=j;
maxp=Sum[j];
}
if(minw==Dist[j] && maxp<Sum[j])
{
maxp=Sum[j];
k=j;
}
}
} Move[k]=true; for(j=;j<Top;j++)
{
if(!Move[j])
{
if(Dist[j]==Dist[k]+Graph[k][j])
{
Way[j]+=Way[k];
if(Sum[j]<Sum[k]+Peo[j])
{
Sum[j]=Sum[k]+Peo[j];
}
}
if(Dist[j]>Dist[k]+Graph[k][j])
{
Dist[j]=Dist[k]+Graph[k][j];
Sum[j]=Sum[k]+Peo[j];
Way[j]=Way[k];
} }
}
}
}
void Dfs(int end,int Sump)
{
if(end==Start)
{
return;
}
for(int j=;j<Top;j++)
{
if(Sump-Peo[end]==Sum[j] && Dist[end]-Graph[end][j]==Dist[j])
{
Dfs(j,Sum[j]);
cout<<j<<" ";
}
} }
int main( )
{ //freopen("1.txt","r",stdin);
cin>>Top>>Edge>>Start>>End;
int i,j;
for(i=;i<Top;i++)
for(j=;j<Top;j++)
Graph[i][j]=Sky; for(i=;i<Top;i++)
cin>>Peo[i]; for(i=;i<Edge;i++)
{
int x,y,z;
cin>>x>>y>>z;
Graph[x][y]=Graph[y][x]=z;
}
Dis();
cout<<Way[End]<<" "<<Sum[End]<<endl; Dfs(End,Sum[End]);
cout<<End<<endl; return ;
}
  1. #include "iostream"
  2. using namespace std;
  3. #define Max 500
  4. #define Sky 99999
  5. int Graph[Max][Max],Top,Start,End,Edge;
  6. int Dist[Max],Move[Max],Peo[Max],Sum[Max],Way[Max];
  7. void Dis()
  8. {
  9. int i,j;
  10. for(i=0;i<Top;i++)
  11. {
  12. Dist[i]=Graph[Start][i];
  13. Move[i]=false;
  14. if(i!=Start && Graph[Start][i]!=Sky)
  15. {
  16. Sum[i]=Peo[Start]+Peo[i];
  17. Way[i]=1;
  18. }
  19. }
  20. Dist[Start]=0;
  21. Move[Start]=true;
  22. Sum[Start]=Peo[Start];
  23. Way[Start]=1;
  24. for(i=1;i<=Top-2;i++)
  25. {
  26. int minw,maxp;
  27. minw=maxp=Sky;
  28. int k=Start;
  29. for(j=0;j<Top;j++)
  30. {
  31. if(!Move[j])
  32. {
  33. if(minw>Dist[j])
  34. {
  35. minw=Dist[j];
  36. k=j;
  37. maxp=Sum[j];
  38. }
  39. if(minw==Dist[j] && maxp<Sum[j])
  40. {
  41. maxp=Sum[j];
  42. k=j;
  43. }
  44. }
  45. }
  46. Move[k]=true;
  47. for(j=0;j<Top;j++)
  48. {
  49. if(!Move[j])
  50. {
  51. if(Dist[j]==Dist[k]+Graph[k][j])
  52. {
  53. Way[j]+=Way[k];
  54. if(Sum[j]<Sum[k]+Peo[j])
  55. {
  56. Sum[j]=Sum[k]+Peo[j];
  57. }
  58. }
  59. if(Dist[j]>Dist[k]+Graph[k][j])
  60. {
  61. Dist[j]=Dist[k]+Graph[k][j];
  62. Sum[j]=Sum[k]+Peo[j];
  63. Way[j]=Way[k];
  64. }
  65. }
  66. }
  67. }
  68. }
  69. void Dfs(int end,int Sump)
  70. {
  71. if(end==Start)
  72. {
  73. return;
  74. }
  75. for(int j=0;j<Top;j++)
  76. {
  77. if(Sump-Peo[end]==Sum[j] && Dist[end]-Graph[end][j]==Dist[j])
  78. {
  79. Dfs(j,Sum[j]);
  80. cout<<j<<" ";
  81. }
  82. }
  83. }
  84. int main( )
  85. {
  86. //freopen("1.txt","r",stdin);
  87. cin>>Top>>Edge>>Start>>End;
  88. int i,j;
  89. for(i=0;i<Top;i++)
  90. for(j=0;j<Top;j++)
  91. Graph[i][j]=Sky;
  92. for(i=0;i<Top;i++)
  93. cin>>Peo[i];
  94. for(i=0;i<Edge;i++)
  95. {
  96. int x,y,z;
  97. cin>>x>>y>>z;
  98. Graph[x][y]=Graph[y][x]=z;
  99. }
  100. Dis();
  101. cout<<Way[End]<<" "<<Sum[End]<<endl;
  102. Dfs(End,Sum[End]);
  103. cout<<End<<endl;
  104. return 0;
  105. }

城市间紧急救援(25 分)(dijstra变形)的更多相关文章

  1. 5-5 城市间紧急救援 (25分)【最短路spfa】

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

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

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

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

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

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

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

  5. 城市间紧急救援 Dijkstra

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

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

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

  7. PAT 甲级1003 Emergency (25)(25 分)(Dikjstra,也可以自己到自己!)

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

  8. PTA 旅游规划(25 分)

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

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

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

随机推荐

  1. secureCRT7.3.4的破解与安装

    1-9为 SecureCRT 7.3.4 安装图解:10-13是 SecureCRT 7.3.4 破解图解,心急的朋友可以直接向下拉. 以下是百度百科对 SecureCRT 的介绍: SecureCR ...

  2. mysql数据库优化课程---9、php用什么写的

    mysql数据库优化课程---9.php用什么写的 一.总结 一句话总结:php是用c语言写的,所以php里面的那些模块什么都是c语言 c 1.php用什么写的? c php是用c语言写的,所以php ...

  3. 接口测试工具---postman下载地址

    接口测试工具---postman下载地址: https://app.getpostman.com/app/download/win64?_ga=2.3555895.622696496.15081214 ...

  4. 【河南第十届省赛-D】年终奖金

    题目描述 ***公司承接了N个项目需要年底完成,每个项目有一定的难度系数.由于项目太多了,需要招聘大量的技术人员.要求每个技术人员至少完成K个项目. 考虑到有些项目之间相似性以及项目的难易程度,为了避 ...

  5. 面试题48:用C++设计一个不能被继承的类

    解法一:把构造函数设为私有 将构造函数定义为私有,然后通过定义公有的静态函数来创建和释放类的实例. { public: static SealedClass1* GetInstance() { ret ...

  6. CSS: The resize Property

    用户手动调节输入框样式: <!DOCTYPE html> <html> <head> <style> div { border: 2px solid; ...

  7. New Concept English three (27)

    35w/m 67 It has been said that everyone lives by selling something. In the light of this statement, ...

  8. Android onTouchEvent和setOnTouchListener中onTouch的区别

    OnTouchEvent()方法 是获取的对屏幕的各种操作,比如向左向右滑动,点击返回按钮等等. 属于一个宏观的屏幕触摸监控. OnTouchListener()方法 是获取某一个控件某一个View的 ...

  9. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  10. elasticsearch聚合案例--分组、求最大值再求最大值的均值

    一.需求 A.B.C代表3个用户,第二列代表各自的得分,求A.B.C的最好成绩以及A.B.C最好成绩的均值 A 10 A 11 A 13 B 11 B 11 B 12 C 10 C 10 C 11 C ...