畅通工程续

#include<stdio.h>
int main()
{
    int n=0,m=0,i=0,j=0,k=0,l=0,x[205][205]={0},a=0,b=0,c=0,s=0,t=0,d[205]={0};
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<=n;i++)
        {
            for(j=0;j<=n;j++)
            {
                x[i][j]=0;
            }
        }
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            if((x[a][b]==0)||(x[a][b]>c))
            {
                x[a][b]=c;
                x[b][a]=c;
            }
            if(a==b) x[a][b]=0;
        }
        scanf("%d%d",&s,&t);
        for(i=0;i<=n;i++)
            d[i]=0;
        d[s]=1;
        for(i=0;i<n;i++)
        {
            j=0x3f3f3f3f;//记录未被标记过的到s最短的点的距离,注意一开始要设置成最大。
            l=-1;
            for(k=0;k<n;k++)
            {
                if((x[s][k]>0)&&(x[s][k]<j)&&(d[k]==0))
                {
                    j=x[s][k];
                    l=k;
                }
            }
            if(l>-1)
            {
                d[l]=1;
                for(k=0;k<n;k++)
                {
                    if((x[l][k]>0)&&(x[l][k]+x[s][l]<x[s][k]))
                    {
                        x[s][k]=x[l][k]+x[s][l];
                    }
                    if((x[l][k]>0)&&(x[s][k]==0)&&(k!=s))
                    {
                        x[s][k]=x[l][k]+x[s][l];
                    }
                }
            }
        }
        if((x[s][t]!=0)&&(s!=t)) printf("%d
",x[s][t]);
        else  if(s==t) printf("0
");
        else printf("-1
");
    }

}
原文地址:https://www.cnblogs.com/NWUACM/p/6735977.html