http://poj.org/problem?id=2387
自己在纸上比划比划就比较清楚
#include<stdio.h> #include<string.h> #define INF 0xfffffff #define N 1002 int map[N][N],vis[N],dis[N],min,t,n; void dijkstra() { int i,j,k; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dis[i]=map[1][i]; dis[1]=0; vis[1]=1; for(i=1;i<=n;i++) { min=INF; for(j=1;j<=n;j++) if(!vis[j]&&dis[j]<min) { min=dis[j]; k=j; } if(min==INF) break; vis[k]=1; for(j=1;j<=n;j++) if(!vis[j]&&dis[j]>dis[k]+map[k][j]) dis[j]=dis[k]+map[k][j]; } printf("%d\n",dis[n]); } int main(void) { int i,j,a,b,c; while(scanf("%d%d",&t,&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) map[i][j]=INF; for(i=1;i<=t;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; } dijkstra(); } return 0; }