题目链接
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
11bool 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/
欢迎讨论和交流!