Floyd
对于求解最短路径的问题我们知道可以通过深度或广度优先算法实现,但是我们发现如果要让任意2点(例如:a顶点到b顶点)之间的路程变短,那么我们只能引入第三个点(顶点k),并通过这个顶点k中转,即(a->k->b),才能缩短原来顶点a到顶点b的路程。甚至有时候我们需要引入多个顶点进行中转会让其路程更短(例如:a->k1->k2->b)
上图中原本顶点4到顶点3的路径为12,现在我们经过1号顶点中转(4->1->3)路程将缩短为11,如果我们再通过2号顶点中转(4->1->2->3)则路程将缩短为10
代码实现
int[][] arrs = new int[4][4];
//将上图以二维数组的形式存储起来
private void initArrs() {
for (int i = 0; i <= 3; i++) {
arrs[i][i] = 0;
}
arrs[0][1] = 2;
arrs[0][2] = 10;
arrs[0][3] = 4;
arrs[1][0] = 999;
arrs[1][2] = 3;
arrs[1][3] = 999;
arrs[2][0] = 7;
arrs[2][1] = 999;
arrs[2][3] = 1;
arrs[3][0] = 5;
arrs[3][1] = 999;
arrs[3][2] = 12;
}
@Test
public void testFloyd() {
initArrs();
for (int k = 0; k <= 3; k++) {
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= 3; j++) {
if (arrs[i][j] > (arrs[i][k] + arrs[k][j])) {
arrs[i][j] = arrs[i][k] + arrs[k][j];
}
}
}
}
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= 3; j++) {
System.out.print(arrs[i][j] + " ");
}
System.out.println();
}
}