1. 程式人生 > >1003 Emergency (25 分)--- Dijkstra求解

1003 Emergency (25 分)--- Dijkstra求解

題目地址: 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 最短距離 
		...
	}
}

演算法筆記:提取碼:6vur