Floyd算法
通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
其状态转移方程如下:map[i,j]:=min{map[i,k]+map[k,j],map[i,j]}
问题描述
现已知有N(N<=10)个城市M(M<=30)条路,保证每个城市之间有路,单向到达,每个城市之间的路程不一样,求任意两个城市之间最短路程。
样例输入
4 8 (N M)
1 2 2 (城市名称 城市名称 路程)
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12
样例输出
0 2 5 4 (第一个城市到其他城市的最短路程)
9 0 3 4 (第二个城市到其他城市的最短路程)
6 8 0 1 …
5 7 10 0
题目来自 剑断青丝i
题目分析
在已知输入输出中我们可以得到图中信息:
考虑方法
由于该题是城市到城市之间的路程可能是不同的。
所以我们需要考虑一个结构,能够存储两个城市的城市名及路程。这时我们可以考虑使用二维数组。
例如:
城市1到城市2的路程表示:a[1][2] = 2
城市1到城市3的路程表示:a[1][3] = 6
城市3到城市1的路程表示:a[3][1] = 7
二维数组很轻松地帮我们解决了数据存储的问题。
初始化
一开始,我们需要将a[x][x]这类自己城市到自己城市的路程设置为0,将其他路程统一先设置为一个较大的数,方便将来程序比较的时候被替代。
求最短路径核心代码
这段代码很短,但它完成了求最短路程的工作,所以很棒。
//求最短路径核心代码
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(a[i][j]>a[i][k]+a[k][j])
a[i]