Floyd的核心代码只有三个for循环,也就是五行代码,实现起来很简单(原谅我使用如此恶劣的用词)的哟!
核心代码如下:
for(int k = 1; k <= m; k++) {//可以理解为中转站点
for (int i = 1; i <= m; i++) {//行
for (int j = 1; j <= m; j++) {//列
if ( <span style="color:#cc0000;">map[i][k] <min && map[k][j] < min &&</span>
map[i][j] > map[i][k] + map[k][j] ) {
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
下面看例子:
我们用邻接矩阵对图进行存储:
实现如下:
现在只允许经过一号顶点,求任意两点之间的最短路径,变换后如下图:
现在只允许经过1号和2号顶点,变换后如下图:
以此类推最近任意两点之间的最短路径为:
其实基本思想就是:最开始只允许经过1号顶点进行中转,接下来只允许经过1号和2号顶点进行中转………允许经过n~1号所有的顶点进行中转,求任意两点之间的最短路径。
从 i 号顶点到 j 号顶点只经过前 k 号点的最短路径。
下面看java代码:
import java.util.Scanner;
//floyed算法
public class floyed {
static int m, n;
static int[][] map;
static int min = 99999999;
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
m = sc.nextInt();
n = sc.nextInt();
map = new int[m + 1][m + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= m; j++) {
map[i][j] = min;
}
map[i][i] = 0;
}
for (int i = 1; i <= n; i++) {
int p1 = sc.nextInt();
int p2 = sc.nextInt();
map[p1][p2] = sc.nextInt();
}
for (int k = 1; k <= m; k++) {
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= m; j++) {
if (map[i][k] < min && map[k][j] < min && map[i][j] > map[i][k] + map[k][j]) {
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= m; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}
输入数据为:
4 8
1 2 2
2 3 3
1 3 6
3 1 7
1 4 4
4 1 5
3 4 1
4 3 12
输出数据为:
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0
若有bug,不足望悉心指出,thanks!!!