#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; }