题目地址: 1003 Emergency (25 分)
本题本质就是求起点到目标点最短路径
#include <bits/stdc++.h>
using namespace std;
int n, m, c1, c2; //n为城市数,m为道路数,c1为起点,c2为目标点
int INF = 0x3fffffff;
const int maxn = 1010;
bool vis[maxn]; //标记该点是否被访问过
int d[maxn]; //起点(c1)到各点(i)最短距离
int resTeam[maxn]; //每一个点(城市)救援人数
int adj[maxn][maxn]; //adj[x][y] 为 x 城市到 y 城市道路距离
int maxresTeam[maxn]; //每条路径最多人数
int pathCount[maxn]; //起点到各点最短路径条数
void dijkstra() {
//初始化
fill(d,d+maxn,INF); //起点到各顶点距离初始化为正无穷
d[c1] = 0; //起点到起点距离为0
maxresTeam[c1] = resTeam[c1]; //起点救援人数
pathCount[c1] = 1; //起点自己到自己条数为 1
for (int i = 0; i < n; i++) {
int index = -1; //index 使 d[index] 最小
int min = INF; //存放该最小的d[index]
for (int j = 0; j < n; j++) { //查找该点到未访问点最小距离的点
if (vis[j] == true) continue; //被访问过,直接下一个循环
if (d[j] < min) { //更新最短距离
index = j;
min = d[j];
}
}
// if (index == -1) return;
if (min == INF || index == c2) break; //这两个条件选择一个就行
vis[index] = true; //标记点 index 已经被访问
//比较起点到 b 点距离和起点到 index 点,再从 index 到 b 距离,更新起点到 b 最短距离
for (int i = 0; i < n; i++) {
if (vis[i] == true || adj[index][i] == 0) continue;
if (adj[index][i] + d[index] < d[i]) { //出现距离小一点的路径
d[i] = adj[index][i] + d[index]; //更新起点到i点最小距离
maxresTeam[i] = maxresTeam[index] + resTeam[i]; //更新救援人数
pathCount[i] = pathCount[index]; //更新起点到i点最短路径条数
} else if (adj[index][i] + d[index] == d[i]) { //两条路径长度相等
pathCount[i] += pathCount[index]; //从起点到该点路径条数=该点其他点到该点路径条数 + 从起点到 index 路径条数
if (maxresTeam[i] < maxresTeam[index] + resTeam[i]) { //更新最多救援人数
maxresTeam[i] = maxresTeam[index] + resTeam[i]; //如果从 index 到顶底 i 救援人数加上顶底 i 原来人数 大于已经保存的从起点到顶点i的人数
}
}
}
}
}
int main() {
scanf("%d %d %d %d", &n, &m, &c1, &c2);
for (int i = 0; i < n; i++) {
scanf("%d", &resTeam[i]);
}
for (int i = 0; i < m; i++) {
int x, y, len;
scanf("%d %d %d", &x, &y, &len);
adj[x][y] = adj[y][x] = len;
}
dijkstra();
printf("%d %d\n", pathCount[c2], maxresTeam[c2]);
return 0;
}
总结模板
void dijkstra() {
初始化(起点)
查找起点到各点最短距离
for (i:0->n) {
for(j:0->n ) {
int index = -1; //index 使 d[index] 最小
int min = INF; //存放该最小的d[index]
}
index == -1 return
比较起点到 b 点距离和起点到 index 点,再从 index 到 b 距离,更新起点到 b 最短距离
...
}
}