hdu1596

很简单的一道dijkstr模板题,硬是让我RE了一个上午,可恨!这道题map[i][j]的取值范围是[0,1]。结果,我把inf设置为0!kao,莫名其妙的RE接踵而至。快整死我了,后来吧inf改为-100。立刻AC!吐血啊

以后在没把握的情况下,远离边界。

AC:

#include<stdio.h>
#define  inf -100                                                            //问题就在这儿
double map[1010][1010];                 //注意重边
double d[1010];
int s[1010];
int n;

double dij(int v,int e)
{
    int i,j,pos;
    double max;
    for(i=1;i<=n;i++)
    {
        s[i]=0;
        d[i]=map[v][i];
    }
    s[v]=1;
    d[v]=1;                //自己到自己的安全系数为1 
    for(i=1;i<n;i++)
    {
        max=inf;
        for(j=1;j<=n;j++)
        {
            if(!s[j]&&max<d[j])
            {
                pos=j;
                max=d[j];
            }
        }
        s[pos]=1;
        if(pos==e||max==inf) break;
        for(j=1;j<=n;j++)
        {
            if(!s[j]&&d[j]<(d[pos]*map[pos][j]))
            d[j]=d[pos]*map[pos][j];
        }
    }
    return d[e];
}
int main()
{
    int i,j,k;
    int q;
    int a,b;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                scanf("%lf",&map[i][j]);
            }
        }
        scanf("%d",&q);
        for(i=1;i<=q;i++)
        {
            scanf("%d%d",&a,&b);
            if(a==b)
            printf("%.3lf\n",map[a][b]);
            else
            {
    if(dij(a,b)>0)
    printf("%.3lf\n",dij(a,b));
    else
    printf("What a pity!\n");
   }
           
        }
    }
    return 0;
}

posted on 2012-03-21 12:36  hrbust_09zhangyabin  阅读(262)  评论(0编辑  收藏  举报