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$ 集合中的节点为中间节点的最短路径的长度。
- 若最短路径经过点 $k$,则 $D_{i,j,k} = D_{i,k,k - 1} + D_{k,j,k - 1}$;
- 若最短路径不经过点 $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$ 三个点的最小环。然后统计最小的环,就是答案。
咕咕咕...