1. 程式人生 > >find the safest road(最短路dijkstra)

find the safest road(最短路dijkstra)

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]);
       }
   }
}