Find the safest road(HDU-1596)
生活随笔
收集整理的這篇文章主要介紹了
Find the safest road(HDU-1596)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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
輸入包括多個測試實例,每個實例包括:<br>第一行:n。n表示城市的個數n<=1000;<br>接著是一個n*n的矩陣表示兩個城市之間的安全系數,(0可以理解為那兩個城市之間沒有直接的通道)<br>接著是Q個8600要旅游的路線,每行有兩個數字,表示8600所在的城市和要去的城市。
Output
如果8600無法達到他的目的地,輸出"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
思路:求一個圖中的最長路,類似模版題,本來想用Dijkstra算法,但算了算時間復雜度,發現使用Floyed算法不會超時,果斷使用
Source Program
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #define INF 9999999999999999999 #define N 1001 #define MOD 1000000007 #define E 1e-12 using namespace std; double g[N][N]; int main() {int n,m;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%lf",&g[i][j]);for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=k&&j!=i&&j!=k)if(g[i][j]<g[i][k]*g[k][j])g[i][j]=g[i][k]*g[k][j];scanf("%d",&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);if(g[x][y]!=0)printf("%.3lf\n",g[x][y]);elseprintf("What a pity!\n");}}return 0; }總結
以上是生活随笔為你收集整理的Find the safest road(HDU-1596)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金明的预算方案(洛谷-P1064)
- 下一篇: 珍珠(信息学奥赛一本通-T1384)