L2-001. 紧急救援

时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

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

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:

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

输入样例:

  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 <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. int INF = ;
  7. int e[][];
  8. int d[];
  9. int a[];
  10. int v[];
  11. int r[];
  12. int su[];
  13. int ans[];
  14. int path[];
  15. int sum=;
  16. int m;
  17. int n = ;
  18. void dijkstra(int s)
  19. {
  20. int i,j;
  21. for(i = ; i <=n ; i++)
  22. {
  23. path[i]=s;
  24. d[i] = e[s][i];
  25. if(s != i && e[s][i] != INF) //如果可以走
  26. {
  27. su[i] = r[i] + r[s];
  28. ans[i] = ;//初始化路数为1
  29. }
  30. }
  31. d[s]=;
  32. v[s]=;
  33. while()
  34. {
  35. int k=-;
  36. int min = INF;
  37. for (j = ; j <= n; j++)
  38. {
  39. if (v[j] == && d[j] < min)
  40. {
  41. min = d[j];
  42. k = j;
  43. }
  44. }
  45. if(k==-) break;
  46. v[k] = ;//标记已被挑过
  47. for (j = ; j <= n; j++)
  48. {
  49. if (!v[j]&&d[j] > d[k] + e[k][j])//利用k点对各个点松弛
  50. {
  51. ans[j]=ans[k];//路数更新
  52. d[j] = d[k] + e[k][j];
  53. su[j]=su[k]+r[j];//人数更新
  54. path[j]=k;//保存路径
  55. }
  56. else if(!v[j]&&d[j]==d[k]+e[k][j])
  57. {
  58. ans[j]+=ans[k];//路数更新
  59. if(su[j]<su[k]+r[j])
  60. {
  61. su[j]=su[k]+r[j];//人数更新
  62. path[j]=k;//保存路径
  63. }
  64.  
  65. }
  66. }
  67. }
  68.  
  69. }
  70. int main()
  71. {
  72. int i, j,s,d;
  73. cin>>n>>m>>s>>d;
  74. s++;//我是从1开始计数
  75. d++;
  76. memset(v, , sizeof(v));
  77. memset(ans, , sizeof(ans));
  78. memset(path, , sizeof(path));
  79. memset(su, , sizeof(su));
  80. for (i = ; i <=n; i++)
  81. {
  82. for (j =; j <=n; j++)
  83. {
  84. if (i == j) e[i][j] = ;
  85. else e[i][j] = INF;
  86. }
  87. }
  88. for(int i=;i<=n;i++) cin>>r[i];
  89. for (i = ; i <= m; i++)
  90. {
  91. int x,y,k;
  92. cin >> x >> y >> k;
  93. x++;
  94. y++;
  95. if (e[x][y] > k)//两城市之间可能有多班公交
  96. {
  97. e[x][y] = k;
  98. e[y][x] = k;
  99. }
  100. }
  101. if(n == ) //特判,其实不考虑也能过
  102. {
  103. printf("1 %d\n1", r[]);
  104. return ;
  105. }
  106. dijkstra(s);
  107. int p[],temp=d;
  108. int k=;
  109. while(temp!=s) //输出路径
  110. {
  111. p[k++]=temp;
  112. temp=path[temp];
  113. }
  114. p[k]=s;
  115. cout<<ans[d]<<" "<<su[d]<<endl;
  116. for(i=k;i>=;i--)
  117. {
  118. cout<<p[i]-<<" ";
  119. }
  120. cout<<d-<<endl;
  121.  
  122. return ;
  123. }

天梯L2-001. 紧急救援(25分)的更多相关文章

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

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

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

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

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

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

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

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

  5. 天梯 L2 紧急救援 (dijkstra变形+记录路径)

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

  6. L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...

  7. 天梯赛 L2-001 紧急救援

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

  8. PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...

  9. L1-049 天梯赛座位分配 (20 分)

    L1-049 天梯赛座位分配 (20 分)(Java解法) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所 ...

随机推荐

  1. Kubernetes 部署Mysql 主从复制集群

    Mysql主从参考文章: https://www.jianshu.com/p/509b65e9a4f5 http://blog.51cto.com/ylw6006/2071864 Statefulse ...

  2. Eclipse Task的使用

    参考链接:http://blog.csdn.net/limb99/article/details/8881891; http://hi.baidu.com/jinxv1987/item/64496f6 ...

  3. 【转载】poj 1276 Cash Machine 【凑钱数的问题】【枚举思路 或者 多重背包解决】

    转载地址:http://m.blog.csdn.net/blog/u010489766/9229011 题目链接:http://poj.org/problem?id=1276 题意:机器里面共有n种面 ...

  4. 【转载】丑数humble numbers

    转载地址:http://blog.csdn.net/qwerty_xk/article/details/12749961 题:只有2 3 5 这三个因子的数,求第1500个   设1为第一个丑数,求第 ...

  5. MySQL之——提示"mysql deamon failed to start"错误的解决方法

    网站突然连接不上数据库,于是直接重启了一下服务器.进到cli模式下,执行 service myqsld start 发现还是提示"mysql deamon failed to start&q ...

  6. 关于CKEDITOR的一些小问题

    <textarea  name="tMessage" ></textarea> <script type="text/javascript& ...

  7. redis 按空间范围查询点位

    GEORADIUS GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC| ...

  8. 数据库排序规则的冲突(理解collate Chinese_PRC_CI_AS)

    之前碰到了数据库排序规则冲突问题,即百度或者 Google 的老话题: “ 无法解决 equal to 操作中‘ sql_latin1_general_cp1_ci_as ’和‘ chinese_pr ...

  9. Win10 14316 bash

    更新 WSL ~~~ 现在添加删除组件中勾选 Windows Subsystem for Linux 然后运行bash,会提示一个链接,浏览器打开后会出现App Store安装Ubuntu 再次运行b ...

  10. cassandra——可以预料的查询,如果你的查询条件有一个是根据索引查询,那其它非索引非主键字段,可以通过加一个ALLOW FILTERING来过滤实现

    cassandra的索引查询和排序 转自:http://zhaoyanblog.com/archives/499.html   cassandra的索引查询和排序 cassandra的查询虽然很弱,但 ...