题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805523835109376
题解
题目要求
- 有几个城市,每个城市中有多个救援队,城市间由公路相连,公路的长度不一 
- 输入 - N:正整数,不超过500,城市的数量,城市索引为[0,N-1] 
- M:公路的数量 
- c1:你现在所在的城市 
- c2:你需要去的城市 
- 各城市中救援队数量:N个整数 
- 各条公路连接的两个城市其该公路的长度:M行 - 保证c1到c2至少有一条路径 
 
- 输出 - c1到c2的最短路径的数量
- 在保证路径最短的前提下,最多可以聚集多少只救援队
 
解题思路
- dijkstra算法 - 特点 - 适用于边权为正的情况
- 单源最短路(Single-Source Shortest Paths,SSSP),求单个源点到所有结点的最短路
- 同时适用于有向图和无向图
 
- 伪代码 - n个结点 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11- bool visited[n]; // 标记:是否找到源点s到某点的最短路径 
 int dis[n]; // 记录源点s到某点的最短路径的长度
 int w[n][n]; // 结点间的距离
 visited数组置false;
 dis数组置无穷大,dis[s]置0;
 循环n次{
 寻找未被标记的、距离结点s最近的结点u;
 如果找到u则将其标记(visited[u] = true),否则结束循环;
 如果存在边<u,v>,则更新dis[v] = min(dis[v], dis[u] + w[u][v]); // 贪心
 }
 
- 其它 - c1到c2的最短路径的数量 - pathNum- 如果 - dis[v] < dis[u] + w[u][v],则- pathNum[v] = path[u]- u到v只有一条边,所以源点到u和v的路径的数量相等 
- 如果 - dis[v] == dis[u] + w[u][v],则- pathNum[v] = path[u] + path[v]- 在距离相等的情况下,除了经过u,还可以从其他结点到达v 
 
- 在保证路径最短的前提下,最多可以聚集多少只救援队 - 如果 - dis[v] < dis[u] + w[u][v],则- teamGatherNum[v] = teamGatherNum[u] + teamNum[v]
- 如果 - dis[v] == dis[u] + w[u][v],则- teamGatherNum[v] = min(teamGatherNum[v], teamGatherNum[u] + teamNum[v])- 此时最短路径不止一条,所以要判断哪条路径聚集的救援队更多 
 
 
代码
| 1 | // Problem: PAT Advanced 1003 | 
参考链接
https://blog.csdn.net/liuchuo/article/details/52300668
https://blog.csdn.net/qq_35644234/article/details/60870719
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!