HDU 1596 单源最短路径

来源:互联网 发布:常用服务器端口有哪些 编辑:程序博客网 时间:2024/05/16 05:56
///dijkstra算法#include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<cctype>#include<iomanip>using namespace std;const int inf=10000000;const int maxn=1003;double f[maxn][maxn];int n;double dijkstr(int s,int e){    double dis[maxn];    int v[maxn];    for(int i=1;i<=n;++i)        dis[i]=f[i][s],v[i]=0;    while(1){        double max=-100;        int mj=-1;        for(int i=1;i<=n;++i)            if(!v[i]&&dis[i]>max) max=dis[i],mj=i;        v[mj]=1;        if(mj==e || mj<0) break;        for(int i=1;i<=n;++i)            if(!v[i] && dis[i]<dis[mj]*f[i][mj])                dis[i]=dis[mj]*f[i][mj];///这里是dijkstra算法与prim算法的区别    }    return dis[e];}int main(){    while(scanf("%d",&n)!=EOF){        for(int i=1;i<=n;++i)            for(int j=1;j<=n;++j)                scanf("%lf",&f[i][j]),f[j][i]=f[i][j];        int m; scanf("%d",&m);        for(int i=0,a,b;i<m;++i){            scanf("%d%d",&a,&b);            if(a==b) printf("1.000\n");            if(dijkstr(a,b)>0) printf("%.3lf\n",dijkstr(a,b));            else printf("What a pity!\n");        }    }    return 0;}