图结构练习——最短路径(floyd算法(弗洛伊德))
图结构练习——最短路径
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给定一个带权无向图,求节点1到节点n的最短路径。
输入
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
输出
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
1
0
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #define max 65535 4 int weight[101][101]; 5 int main() 6 { 7 int m,n; 8 while(scanf("%d%d",&m,&n)!=EOF) 9 { 10 int i,j; 11 int k,u,v,w; 12 for(i=1;i<=m;i++)//初始化邻接矩阵 13 { 14 for(j=1;j<=m;j++) 15 weight[i][j]=max; 16 weight[i][i]=0; 17 } 18 for(i=1;i<=n;i++) 19 { 20 scanf("%d%d%d",&u,&v,&w); 21 if(weight[u][v]>w)//去重,取最小值 22 { 23 weight[u][v]=w; 24 weight[v][u]=w; 25 } 26 } 27 //以下是核心算法语句 28 for(k=1;k<=m;k++) 29 for(i=1;i<=m;i++) 30 for(j=1;j<=m;j++) 31 { 32 if(weight[i][j]>(weight[i][k]+weight[k][j])) 33 { 34 weight[i][j]=weight[i][k]+weight[k][j]; 35 } 36 } 37 printf("%d\n",weight[1][m]); 38 } 39 return 0; 40 }