Floyd-Warshall

Floyd-Warshall 的证明

定义:

Floyd-Warshall 算法(英语:Floyd-Warshall algorithm),中文亦称弗洛伊德算法佛洛依德算法,是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。

Floyd-Warshall 算法的时间复杂度为 $O(|V|^{3})$ ,空间复杂度 $O(|V|^{2})$,其中 $V$ 是点集。

原理

Floyd-Warshall 算法的原理是动态规划。

设 $D_{i,j,k}$ 为从 $i$ 到 $j$ 的只以 $1 \cdot\!\cdot\!\cdot k$ 集合中的节点为中间节点的最短路径的长度。

  1. 若最短路径经过点 $k$,则 $D_{i,j,k} = D_{i,k,k - 1} + D_{k,j,k - 1}$;
  2. 若最短路径不经过点 $k$,则 $D_{i,j,k} = D_{i,j,k - 1}$。

因此,$D_{i,j,k} = \min(D_{i, j, k - 1}, D_{i, k, k - 1}, D_{k, j, k - 1})$。

在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。

——摘自维基百科

无向图中的最小环

一般使用 $\text{Floyd}$ 求无向图中由 $n(n \ge 3)$ 个点构成的最小环。

$\text{Floyd}$ 的转移方程:$dist_{i, j} = \sum\limits^{n}_{k=1}min(dist_{i, k} + dist_{k, j})$

例如这里有一个 $u/v$ 的最小环:$u\!-\!v\!-\!w\!-\!u$,我们随便删除一条边 $u\!-\!v$,那么剩下的 $v\!-w\!-u$ 一定是图上 $u/v$ 的最短路。

那怎么和 $\text{Floyd}$ 联系呢?已知:

在 $\text{Floyd}$ 算法枚举 $k_i$ 的时候,已经得到了仅使用前 $k\!-\!1$ 个点做转移的最短路径。

这 $k\!-\!1$ 个点不包括点 $k$,并且他们的最短路径中也不包括 $k$ 点。

那么我们便可以从这前 $k\!-\!1$ 个点中选出两个点 $i/j$ ,并且 $dist_{i, j}$ 已知,所以我们连接 $i/k$ 和 $k/j$,就得到了包涵 $i/j/k$ 三个点的最小环。然后统计最小的环,就是答案。

咕咕咕...

posted @ 2023-12-23 13:35  emo_male_god  阅读(60)  评论(0)    收藏  举报  来源