#include<stdio.h> #include<string.h> #define inf 10000000 int map[110][110],d[110],used[110]; int n; void dijikstra(){ int i,j,k,max; for(i=1;i<=n;i++){ d[i]=map[1][i]; } d[1]=0;used[1]=1; for(i=1;i<=n;i++){ max=inf; for(j=1;j<=n;j++){ if(!used[j]&&max>d[j]){ max=d[j]; k=j; } }//选出当前节点与连接点的最小距离 used[k]=1; for(j=1;j<=n;j++){ if(!used[j]&&d[k]+map[k][j]<d[j]){ d[j]=map[k][j]+d[k]; }//更新节点距离 } } } //dijkstra模板 int main(){ int m,i,j,a,b,val; while(scanf("%d%d",&n,&m)&&(n||m)){ memset(d,0,sizeof(d)); memset(used,0,sizeof(used)); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ map[i][j]=inf; }//初始化 for(i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&val); map[a][b]=map[b][a]=val; } dijikstra(); printf("%d\n",d[n]); } return 0; } //spfa算法 #include<stdio.h> #include<string.h> #define inf 1000000 int map[110][110],dis[110]; int n,vis[110],queue[1010];//队列的长度要比顶点的个数大一些,不然用C过不了,不知为何? void SPFA(){ int i,con; int front=0, reap=1; for(i=1;i<=n;i++){ dis[i]=inf; } queue[front]=1; dis[1]=0; vis[1]=1; while(front<reap){ con=queue[front++]; vis[con]=0; for(i=1;i<=n;i++){ if(dis[con]+map[con][i]<dis[i]){ dis[i]=dis[con]+map[con][i]; if(!vis[i]){ queue[reap++]=i; vis[i]=1; } } } } } int main(){ int m,i,j,a,b,val; while(scanf("%d%d",&n,&m),n||m){ memset(vis,0,sizeof(vis)); memset(queue,0,sizeof(queue)); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ map[i][j]=inf; } for(i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&val); if(map[a][b]>val){ map[a][b]=map[b][a]=val; } } SPFA(); printf("%d\n",dis[n]); } return 0; }