find the safest road(最短路dijkstra)
阿新 • • 發佈:2018-12-22
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
3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3
Sample Output
0.500 0.400 0.500
#include <iostream> #include<cstdio> #include<string.h> #include<cmath> #include<algorithm> #include<cstring> using namespace std; double map[1144][1144],dis[1144]; bool vis[1144]; int n; const double inf = 0x7f7f7f7f; void dijkstra(int st,int ed) { memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) { dis[i]=map[st][i]; } vis[st] = true; dis[st] = 1; for(int i =1;i<=n;i++) { double minn=0; int flag = st; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]>minn) { minn = dis[j]; flag = j; } } if(flag==ed)break; vis[flag] = true; for(int j = 1; j<=n;j++) { if(!vis[j]&&dis[j]<dis[flag]+map[flag][j]) { dis[j] = dis[flag]*map[flag][j]; } } } } int main(){ while(~scanf("%d",&n)) { for(int i = 1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%lf",&map[i][j]); } } int q; scanf("%d",&q); for(int i = 0;i<q;i++) { int st,ed; scanf("%d %d",&st,&ed); dijkstra(st,ed); if(dis[ed]==0)printf("What a pity!\n"); else printf("%.3f\n",dis[ed]); } } }