最短路,直接dijkstra水之,注意重边。

1 #include <stdio.h> 2 #include <string.h> 3 #define MIN(a,b) ((a)<(b)?(a):(b)) 4 #define N 1000 5 #define INF 100000 6 int g[N][N],dist[N],n,m; 7 char vis[N]; 8 void dijkstra() 9 { 10 int i,v,k,min; 11 memset(vis,0,sizeof(vis)); 12 for(i=0;i<n;i++) dist[i]=(i==0?0:INF); 13 for(i=0;i<n;i++) 14 { 15 min=INF; 16 for(v=0;v<n;v++) if(!vis[v]&&dist[v]<=min) min=dist[k=v]; 17 vis[k]=1; 18 for(v=0;v<n;v++) dist[v]=MIN(dist[v],dist[k]+g[k][v]); 19 } 20 } 21 int main() 22 { 23 int i,j,a,b,d; 24 while(~scanf("%d%d",&m,&n)) 25 { 26 for(i=0;i<n;i++) 27 { 28 for(j=i+1;j<n;j++) g[i][j]=g[j][i]=INF; 29 } 30 for(i=0;i<m;i++) 31 { 32 scanf("%d%d%d",&a,&b,&d); 33 a--,b--; 34 g[a][b]=g[b][a]=MIN(d,g[a][b]); 35 } 36 dijkstra(); 37 printf("%d\n",dist[n-1]); 38 } 39 return 0; 40 }