NWU_ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
#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\n",x[s][t]);
        else  if(s==t) printf("0\n");
        else printf("-1\n");
    }

}

 

posted on 2017-04-19 21:29  NWU_ACM  阅读(97)  评论(0编辑  收藏  举报