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

输入格式:
输入第一行给出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

题目思路:
1.题目本质是求最短路径,顺便在求最短路径的过程中进行了一些操作。
2.最短路径的条数 num[MAXN]数组实现
3.“点权”的最大值,用数组weight[], w[]数组实现
4.最短路径的打印,记录路径上每个顶点的前一个点。最终打印的时候再用递归打印。
5.以上三条概念在代码注释中说的比较详细,这算是比较简单的方法了,这道题本身需要的信息量大。如果还不懂可以评论私信我,我会及时回复。

#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 505;
const int INF = 0x3f3f3f3f;
int Graph[MAXN][MAXN];  //图
int weight[MAXN];       //成熟u中的物资数目
int d[MAXN];            //起点s到达顶点u的最短距离
int w[MAXN] = { 0 };   //起点s到达顶点u收集的最大物资数
int num[MAXN] = { 0 }; //起点s到达顶点u的最短轮径的条数
int pre[MAXN];          //起点s到达顶点v的最短路径的前一个顶点
bool Visited[MAXN] = { false };
int n, m, s, ter;
void Dijkstra(int s);
void DFS(int s, int v); //递归遍历,如果不懂这个递归,要好好考虑一下,因为类似的递归还有很多
int main()
{cin >> n >> m >> s >> ter;     //ter是终点fill(Graph[0], Graph[0] + MAXN * MAXN, INF);for (int i = 0; i < n; i++){cin >> weight[i];      //输入每个顶点的人员数pre[i] = i;        //初始化为每个顶点的前一个顶点为本身}int a, b, c;while (m--){cin >> a >> b >> c;Graph[a][b] = Graph[b][a] = c;   //建立无向图}Dijkstra(s);cout << num[ter] << " " << w[ter] << endl;    //这里为什么下标为ter,回过头看一下这些数组本身的含义是什么意思DFS(s, ter);return 0;
}
void Dijkstra(int s)
{fill(d, d + MAXN, INF);d[s] = 0;                     w[0] = weight[0];num[s] = 1;          //以上是初始化for (int i = 0; i < n; i++)       //找到未访问顶点中d[]最小的{int u = -1, MIN = INF;for (int j = 0; j < n; j++)if (!Visited[j] && d[j] < MIN){u = j;MIN = d[j];}if (u == -1) return;Visited[u] = true;   for (int v = 0; v < n; v++)   //以u作为中介点查下下一个顶点v的性质{if (!Visited[v] && Graph[u][v] != INF){if (d[u] + Graph[u][v] < d[v]){d[v] = d[u] + Graph[u][v];    //更新起点到v顶点的最短路径长度w[v] = w[u] + weight[v]; //更新人数num[v] = num[u];         //s到v与s到u的最短路径个数相同pre[v] = u;                  //v的上一个顶点是u}else if (d[u] + Graph[u][v] == d[v]){num[v] += num[u];         //到达v的最短路径的条数加上到达u的最短路径的条数if (w[u] + weight[v] > w[v])  //在路径当都不变时,如果人数增多那么就更新人数{w[v] = w[u] + weight[v];pre[v] = u;}}}}}
}
void DFS(int s, int v)  //从终点开始向上找,和并查集的感觉有点像
{if (v == s)      //如果当前顶点是起点,那么就停止递归{cout << v;return;}DFS(s, pre[v]);cout << " " << v;
}

城市间紧急救援 (25 分)(Dijkstra)相关推荐

  1. PTA7-12 城市间紧急救援 (25 分)(dijkstra+dp)(简单易懂的写法)

    PTA7-12 城市间紧急救援 (25 分) 关于这个题呢,我当时也想了很久没有一点头绪.所以,菜鸡的我一如既往的打开了CSDN(手动滑稽).我看了很多大佬的写法,最普遍的应该就是dijkstra+d ...

  2. 7-11 城市间紧急救援 (25 分)

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

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

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

  4. L2-001 城市间紧急救援 (25分)(迪杰斯特拉算法)

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

  5. 5-35 城市间紧急救援 (25分) pat 数据结构

    题目连接 https://pta.patest.cn/pta/test/15/exam/4/question/862 5-35 城市间紧急救援   (25分) 作为一个城市的应急救援队伍的负责人,你有 ...

  6. 城市间紧急救援 (25 分)

    //迪杰斯特拉算法求城市间紧急救援 #include<iostream> #include<cstring> using namespace std; #define num ...

  7. 城市间紧急救援 (25 分)【dijkstra模板 超时原因】

    立志用最少的代码做最高效的表达 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度 ...

  8. 7-35 城市间紧急救援 (25 分)(思路加详解)

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

  9. 7-2 城市间紧急救援 (25 分)

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

  10. 7-68 城市间紧急救援 (25 分)

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

最新文章

  1. 开源项目贡献者_嘿新手开源贡献者:请写博客。
  2. 新手入门API测试必要了解的知识
  3. 直击灵魂!统计学知识十问十答,你都会吗?
  4. 【Vegas原创】解决System.Web.Extensions版本冲突方法
  5. STlink下载出现st-link usb communication error解决方法
  6. iview实现国际化
  7. 【CSS3初探之变形与动画】令人惊叹的CSS3
  8. ES6新特性之转码器(UmiJS入门)
  9. ssm 静态资源处理器
  10. php事务 面向对象,PHP面向对象之事务脚本模式(详解)
  11. sphinx php 扩展安装
  12. 3097: Hash Killer I
  13. 专硕计算机考研英语一还是二,学硕只会考英语一?专硕只会考英语二?
  14. 从零开始的Multi-armed Bandit
  15. 第71天-内网安全-域横向网络传输应用层隧道技术
  16. flea-db使用之基于对象池的FleaJPAQuery
  17. 谈谈c语言程序如何变成可执行文件,C语言从代码变成可执行程序的步骤
  18. Typora 如何依次打小黑点,空心圆,实心框后恢复空心圆、小黑点
  19. 1052 卖个萌 (20分)特殊符号输入
  20. Wind万得PythonAPI量化接口常用小工具——时序数据处理及工作日前推查询

热门文章

  1. hdu 1536 S-Nim (sg)
  2. 组建Forefront TMG独立陈列(上)-案例介绍与服务器准备
  3. asp.net Coolite 学习
  4. opencv+python 霍夫圆检测原理
  5. 【车道线检测与寻迹】2月24日 CVST工具箱模块仿真与图像处理(二)、基于Vision对象的边缘检测、余弦变换压缩,与峰值信噪比
  6. 6-汇编语言中段的使用+dw+start标号
  7. Redis11-AOF持久化
  8. 用户行为分析最重要的3个点 渠道转化留存
  9. python时间处理,datetime中的strftime/strptime
  10. 问题-Ctrl+F7跟踪值时提示“Function to be called, TGGLPolyhedron3d.AsString, was eliminated by linker”...