http://acm.hdu.edu.cn/showproblem.php?pid=1596

最短路

ps:0可以理解为那两个城市之间没有直接的通道,少看了这个条件错惨,在sx和zbw两位祖先的帮助下认清了这个问题

#include <iostream>
#include <string>
using namespace std;
const double esp=1e-11;
const int maxn=1001;
int n;
double Map[maxn][maxn];
double dis[maxn];
int vis[maxn];
double Dijkstra(int s,int t)
{
    memset(vis,0,sizeof(vis));
    memset(dis,0,sizeof(dis));
    dis[s]=1;
    for(int i=0;i<n;i++)
    {
        int u;
        double ans=-1;
        for(int j=1;j<=n;j++)
            if(!vis[j] && dis[j]>ans)
            { 
                ans=dis[j];
                u=j;
            }
        vis[u]=1;
        if(u==t)return ans;
        for(int j=1;j<=n;j++)
            if(!vis[j] && dis[j]<Map[u][j]*dis[u])
                dis[j]=Map[u][j]*dis[u];
    }
}
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]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(Map[i][j]>1-esp&&Map[i][j]<1+esp)
                    Map[i][j]=0;
        int m,s,t;
        scanf("%d",&m);
        while(m--)
        {
            scanf("%d%d",&s,&t);
            double ans=Dijkstra(s,t);
            if(ans)
                printf("%.3lf\n",ans);
            else
                puts("What a pity!");
        }
    }
    return 0;
}
View Code