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

思路:Dijkstra算法的加强版

  1. #include<bits/stdc++.h>
  2. #define inf 1e9+7
  3. using namespace std;
  4. stack<int >q;
  5. struct node {
  6. long long value = -;//表示从起点到这点的总救援队数目,总价值
  7. int cost = inf;//表示从这点出发的最短长度
  8. int pointvalue;//表示这点拥有的救援队数目
  9. int vis = ;//表示这点是否访问过
  10. int cnt = ;//表示这点拥有的最短路径条数
  11. int fa;//寻找起点
  12. };
  13. node arr[];
  14. int mat[][];
  15.  
  16. void dijkstra(int start, int n) {
  17. int now = start;
  18. arr[start].cnt = ;
  19. arr[start].vis = ;
  20. arr[start].value = arr[start].pointvalue;
  21. arr[start].cost = ;
  22. arr[start].fa = start;
  23. for(int i = ; i < n; i++) {
  24. int minn = inf;
  25. for(int j = ; j < n; j++) { //统计起点到每个点的距离
  26. if(now == j) continue;
  27. if(arr[now].cost != inf && arr[now].cost + mat[now][j] < arr[j].cost && arr[j].vis == ) {//找到这点到与之联通的点的最短距离
  28. arr[j].cost = arr[now].cost + mat[now][j];
  29. arr[j].value = arr[now].value + arr[j].pointvalue;
  30. arr[j].fa = now;
  31. arr[j].cnt = arr[now].cnt;
  32. } else if(arr[now].cost + mat[now][j] == arr[j].cost) { //相等长度则把救援队的数量相加
  33. arr[j].cnt += arr[now].cnt;
  34. if(arr[j].value < arr[now].value + arr[j].pointvalue) {
  35. arr[j].value = arr[now].value + arr[j].pointvalue;
  36. arr[j].fa = now;
  37. }
  38. }
  39. }
  40. for(int j = ; j < n; j++) { //找到这点到与之联通的最短长度的点后则到下一个点
  41. if(now == j) continue;
  42. if(arr[j].vis == && arr[j].cost < minn) {
  43. minn = arr[j].cost;
  44. now = j;
  45. }
  46. }
  47. arr[now].vis = ;
  48. }
  49. }
  50. int main() {
  51. int n, m, start, end;
  52. cin >> n >> m >> start >> end;
  53. for(int i = ; i < n; i++)
  54. cin >> arr[i].pointvalue;//救援队数目(点权);
  55. for(int i = ; i < n; i++) {
  56. for(int j = ; j < n; j++) {
  57. mat[i][j] = inf;
  58. }
  59. }
  60. for(int i = ; i < m; i++) {
  61. int s, e, k;
  62. cin >> s >> e >> k;
  63. mat[s][e] = mat[e][s] = k;
  64. }
  65. dijkstra(start, n);
  66. cout << arr[end].cnt << ' ' << arr[end].value << endl;
  67. while(arr[end].fa != end) {
  68. q.push(end);
  69. end = arr[end].fa;
  70. }
  71. q.push(start);
  72. while(!q.empty()) {
  73. cout << q.top();
  74. q.pop();
  75. if(!q.empty())
  76. cout << ' ';
  77. }
  78. cout << endl;
  79. return ;
  80. }

团体程序设计天梯赛-练习集L2-001. 紧急救援(dijkstra)的更多相关文章

  1. PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集

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

  2. PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集

    L2-023 图着色问题 (25 分)   图着色问题是一个著名的NP完全问题.给定无向图,,问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解 ...

  3. 团体程序设计天梯赛-练习集 L1-007 念数字

    - - ->博主推荐,学生党.程序员必备,点击查看- - - >>>>> 热门文章推荐 以下50道算法编程题访问量较大,包含常用语法,数据结构,解题思路等等,作为C ...

  4. 团体程序设计天梯赛-练习集L2-010. 排座位

    L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...

  5. 团体程序设计天梯赛-练习集L2-007. 家庭房产

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...

  6. PTA L2-002 链表去重 团体程序设计天梯赛-练习集

    L2-002 链表去重(25 分)   给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另 ...

  7. 团体程序设计天梯赛-练习集-L1-045. 宇宙无敌大招呼

    L1-045. 宇宙无敌大招呼 据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”,跟这个世界打个招呼.作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼 ...

  8. 团体程序设计天梯赛-练习集-*L1-043. 阅览室

    L1-043. 阅览室 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过100 ...

  9. 团体程序设计天梯赛-练习集L2-011. 玩转二叉树

    L2-011. 玩转二叉树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜 ...

  10. 团体程序设计天梯赛-练习集L2-009. 抢红包

    L2-009. 抢红包 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 没有人没抢过红包吧…… 这里给出N个人之间互相发红包.抢 ...

随机推荐

  1. AIDL实现Android IPC

    1.AIDL文本解释 在软件工程中,接口定义语言(IDL)已经成为通用术语,是用来描述软件组件接口的特定语言.在Android中,该IDL被称为Android接口定义语言(AIDL),它是纯文本文件, ...

  2. CSS之图片关闭

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Cocos2d-x中自定义粒子系统

    除了使用Cocos2d-x的11种内置粒子系统外,我们还可以通过创建ParticleSystemQuad对象,并设置属性实现自定义粒子系统,通过这种方式完全可以实现我们说需要的各种效果的粒子系统.使用 ...

  4. Quartz 第二课 Jobs and Triggers(官方文档翻译)

    The Quartz API IScheduler—与scheduler交互的主要的接口 IJob—这个接口主要定义scheduler执行内容 IJobDetail—用于定义Jobs实例 ITrigg ...

  5. OC8_setter方法展开

    // // Person.h // OC8_setter方法展开 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zh ...

  6. Js 变量的作用域

    变量的作用域 所有的变量作用域是指在哪里可用哪里不可用 局部作用域和全局作用域 在js中以函数来分割作用域 在函数里面就叫做局部作用域,在函数外面的就叫全局作用域 在函数里面如果省略var 关键字 那 ...

  7. 快速搭建MongoDB分布式集群

    目录Outline 1. prerequisites 2. steps to follow3. configuring the cluster4. a little test to see 1. Pr ...

  8. ios版弹珠游戏源码

    这个是我们比较喜欢玩的一直小游戏的,ios版弹珠游戏源码,该游戏源码来着IOS教程网其他网友提供上传的,大家可以了解一下吧. nore_js_op>     <ignore_js_op&g ...

  9. 一次GC问题定位

    同事有段代码执行时间过长,需要进行优化, Hashmultimap<Int,Bean> map = ...; for (400w*96) { // 计算过程 Bean = doComput ...

  10. 第一个C++

    输入:cin>>(相当于scanf)   #include <iostream> using namespace std; int main() { int number;   ...