1003 Emergency (25 分)--- Dijkstra求解
阿新 • • 發佈:2018-11-08
題目地址: 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 最短距離
...
}
}