一文掌握Floyd算法
结构体
typedef struct struct_graph{
char vexs[MAXN];
int vexnum;//顶点数
int edgnum;//边数
int matirx[MAXN][MAXN];//邻接矩阵
} Graph;
伪代码
//这里是弗洛伊德算法的核心部分
//k为中间点
for(k = 0; k < G.vexnum; k++){
//v为起点
for(v = 0 ; v < G.vexnum; v++){
//w为终点
for(w =0; w < G.vexnum; w++){
if(D[v][w] > (D[v][k] + D[k][w])){
D[v][w] = D[v][k] + D[k][w];//更新最小路径
P[v][w] = P[v][k];//更新最小路径中间顶点
}
}
}
}
思路
- 用数组
dist[i][j]
来记录i,j
之间的最短距离。初始化dist[i][j]
若i=j
则dist[i][j]
=0
- 若
i,j
之间有边连接则的
d
i
s
t
[
i
]
[
j
]
dist[i][j]
dist[i][j]值为该边的权值,否则dist[i][j]
的值为INF
(无穷大)
- 对所有的
k
值从1
到n
,修正任意两点之间的最短距离,计算dist[i][k]
+dist[k][j]
的值,若小于dist[i][j]
,则dist[i][j]
= dist[i][k]
+dist[k][j]
,否则dist[i][j]
的值不变

模板代码
核心代码
int N = 4;
int E = 8;
int[][] G = new int[N][N];
int[][] path = new int[N][N];
int[][] dist = new int[N][N];
public void floyd(int[][] path, int[][] dist) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
dist[i][j] = G[i][j];
}
}
for (int k = 0; k < N; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int tmp = (dist[i][k] == INF || dist[k][j] == INF) ? INF : (dist[i][k] + dist[k][j]);
if (dist[i][j] > tmp) {
dist[i][j] = tmp;
path[i][j] = k;
}
}
}
}
}
测试
public void testOne() {
init();
initEdge();
PrintUtils.printMatrix(G, 10);
PrintUtils.printMatrix(path, 1);
floyd(path, dist);
printHelper();
}
void init() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i != j) G[i][j] = INF;
path[i][j] = -1;
}
}
}
private void initEdge() {
Edge[] edges = new Edge[E];
edges[0] = new Edge(0, 1, 5);
edges[1] = new Edge(0, 3, 7);
edges[2] = new Edge(1, 2, 4);
edges[3] = new Edge(1, 3, 2);
edges[4] = new Edge(2, 0, 3);
edges[5] = new Edge(2, 1, 3);
edges[6] = new Edge(2, 3, 2);
edges[7] = new Edge(3, 2, 1);
for (int i = 0; i < E; i++) {
G[edges[i].u][edges[i].v] = edges[i].w;
}
}
private void printHelper() {
System.out.printf("floyd dist: \n");
PrintUtils.printMatrix(dist, 2);
System.out.printf("floyd path: \n");
PrintUtils.printMatrix(path, 2);
int u = 3, v = 0;
System.out.printf("%d--->", u);
printPath(path, u, v);
System.out.printf("%d\n", v);
}
public class PrintUtils {
public static void printMatrix(int[][] matrix, int d) {
int rows = matrix.length, cols = matrix[0].length;
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
System.out.print(String.format("%" + d + "s", matrix[i][j]) + " ");
}
System.out.println();
}
System.out.println("--------------");
}
}
番外
int[][] path;
public void findPath(int i, int j) {
int k = path[i][j];
if (k == -1) return;
findPath(i, k);
System.out.printf("%d ", k);
findPath(k, j);
}
Reference
- https://www.cnblogs.com/skywang12345/p/3711532.html?utm_source=tuicool&utm_medium=referral