求单源最短路的题,因为边权非负,所以可以用dijkstra。这题有一点需要注意的地方是有重边,在读数据时取较小的即可。
View Code
1 #include <stdio.h> 2 #include <string.h> 3 #define MIN(a,b) ((a)<(b)?(a):(b)) 4 #define N 200 5 #define INF 2000000 6 int g[N][N]; 7 int dist[N]; 8 int n,m; 9 char vis[N]; 10 void dijkstra(int u) 11 { 12 int i,min,k,v; 13 memset(vis,0,sizeof(vis)); 14 for(i=0;i<n;i++) dist[i]=(i==u?0:INF); 15 for(i=0;i<n;i++) 16 { 17 min=INF; 18 for(v=0;v<n;v++) if(!vis[v]&&dist[v]<=min) min=dist[k=v]; 19 vis[k]=1; 20 for(v=0;v<n;v++) dist[v]=MIN(dist[v],dist[k]+g[k][v]); 21 } 22 } 23 int main() 24 { 25 int i,a,b,d,s,t; 26 while(~scanf("%d%d",&n,&m)) 27 { 28 for(a=0;a<n;a++) 29 { 30 for(b=a+1;b<n;b++) g[a][b]=g[b][a]=INF; 31 } 32 for(i=0;i<m;i++) scanf("%d%d%d",&a,&b,&d),g[a][b]=g[b][a]=MIN(d,g[a][b]); 33 scanf("%d%d",&s,&t); 34 dijkstra(s); 35 if(dist[t]<INF) printf("%d\n",dist[t]); 36 else printf("-1\n"); 37 } 38 return 0; 39 }