hdoj 1596 find the safest road【dijkstra】
阿新 • • 發佈:2019-01-01
find the safest road
Problem Description XX星球有很多城市,每個城市之間有一條或多條飛行通道,但是並不是所有的路都是很安全的,每一條路有一個安全係數s,s是在 0 和 1 間的實數(包括0,1),一條從u 到 v 的通道P 的安全度為Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的邊 ,現在8600 想出去旅遊,面對這這麼多的路,他想找一條最安全的路。但是8600 的數學不好,想請你幫忙 ^_^ Input 輸入包括多個測試例項,每個例項包括:第一行:n。n表示城市的個數n<=1000;
接著是一個n*n的矩陣表示兩個城市之間的安全係數,(0可以理解為那兩個城市之間沒有直接的通道)
接著是Q個8600要旅遊的路線,每行有兩個數字,表示8600所在的城市和要去的城市 Output 如果86無法達到他的目的地,輸出"What a pity!",
其他的輸出這兩個城市之間的最安全道路的安全係數,保留三位小數。 Sample Input
解析:可以看做求最長路勁,所以可以用dijkstra,用float map[1001][1001]即可。 注意:當前點到當前點的安全係數為1, Accept程式碼【C++】
#include <cstdio> using namespace std; float map[1001][1001]; bool vis[1001]; float dis[1001]; int n; int a, b; void Dijkstra(int s) { for(int i = 1; i <= n; i++){ vis[i] = 0; dis[i] = 0; } dis[s] = 1;<span style="white-space:pre"> </span>//注意當前點到當前點的安全係數為1 while(1) { int v = -1; for(int i = 1; i <= n; i++) if(!vis[i] && (v == -1 || dis[i] > dis[v])) v = i; if(v == -1) break; vis[v] = 1; for(int i = 1; i <= n; i++) if(dis[i] < dis[v] * map[v][i]) dis[i] = dis[v] * map[v][i]; } if(dis[b] == 0) printf("What a pity!\n"); else printf("%.3f\n", dis[b]); } int main() { while(scanf("%d", &n) != EOF) { for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) scanf("%f", &map[i][j]); int q; scanf("%d", &q); while(q--) { scanf("%d%d", &a, &b); Dijkstra(a); } } return 0; }