Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
以a,b,c,d为节点构成的图的邻接矩阵如下:
a | b | c | d | |
---|---|---|---|---|
a | 0 | 1 | 7 | 4 |
b | +∞ | 0 | 6 | +∞ |
c | 3 | +∞ | 0 | 8 |
d | 5 | +∞ | 9 | 0 |
package main
import (
"fmt"
)
func floyd(distance [][]int) { // distance is a n*n slice
n := len(distance)
for k := 0; k < n; k++ {
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
if tmp := distance[i][k] + distance[k][j]; distance[i][j] > tmp {
distance[i][j] = tmp
}
}
}
}
}
func main() {
max := 0x3f3f3f3f
mp := [][]int{ // 进阶矩阵
{0, 1, 7, 4},
{max, 0, 6, max},
{3, max, 0, 8},
{5, max, 9, 0},
}
floyd(mp)
for i := 0; i < len(mp); i++ {
for j := 0; j < len(mp); j++ {
fmt.Println(i, j, "最短距离", mp[i][j])
}
}
}