#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n,m,hash[1010],dis[1010],map[1010][1010];
const int inf=0x7fffffff;
void dijstra()
{
     dis[1]=0;
     for(int i=1;i<=n;i++)
     {
          int t=inf,pos;
          for(int j=1;j<=n;j++)//找出当前未标记的最小顶点
          {
              if(hash[j]==0)
              {
                  if(dis[j]<t)
                  {
                      t=dis[j];
                      pos=j;
                  }
              }
          }
          hash[pos]=1;
          if(pos==n)   break;//路径压缩
          for(int j=1;j<=n;j++)//不断更改值使之最小
          {
              if(hash[j]==0)
              {
                  if(map[pos][j]!=inf&&dis[pos]+map[pos][j]<dis[j])
                  {
                      dis[j]=dis[pos]+map[pos][j];
                  }
              }
          }
     }
}
int main()
{
    int a,b,val;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
         for(int i=1;i<=n;i++)//初始化
         {
             hash[i]=0;
             dis[i]=inf;
             for(int j=1;j<=n;j++)
             {
                 map[i][j]=inf;        
             }
         }
         for(int i=1;i<=m;i++)//输入边对应的顶点及权值
         {
             scanf("%d%d%d",&a,&b,&val);
             if(val<map[a][b]&&a!=b)//注意此处不能丢,因为有可能输入相同的边对应于不同的权值,找最小的输入。
             {
                 map[a][b]=map[b][a]=val;
             }
         }
         dijstra();
         printf("%d\n",dis[n]);
    }
    system("pause");
    return 0;
}
posted on 2011-05-20 19:30  枫叶飘泪  阅读(324)  评论(4编辑  收藏  举报