Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
给定一个带权无向图,求节点1到节点n的最短路径。
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
赵利强
///*****请参考提示里的链接,不然看解释也看不懂; #include <stdio.h> #include <string.h> #define Inf 0x3f3f3f3f int map[105][105],vis[105],path[105]; void dijkstra(int n,int begin,int end) { for(int i=1; i<=n; i++) { path[i]=map[begin][i]; }///*************将i到中间位置的距离全部表示出来; vis[begin]=1; path[begin]=0; int t; for(int i=2; i<=n; i++) { int min=Inf; for(int j=1; j<=n; j++) { if(!vis[j]&&path[j]<min) { min=path[j]; t=j; } }///找到i到中间点t的最短距离; vis[t]=1; for(int k=1; k<=n; k++) { if(!vis[k]) { if(path[t]+map[t][k]<path[k]) path[k]=path[t]+map[t][k]; } }///找到中间点t到k点的最短距离; } printf("%d\n",path[end]); } int main() { int n,m,v,u,c; while(~scanf("%d%d",&n,&m)) { if(m==0) printf("0\n"); else { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(j==i) map[i][j]=0; else map[i][j]=Inf; } memset(vis,0,sizeof(vis)); for(int i=1; i<=m; i++) { scanf("%d%d%d",&v,&u,&c); if(map[v][u]>c) map[v][u]=map[u][v]=c; } dijkstra(n,1,n); } } return 0; }
