使用Floyd算法求最小环
Floyd
Floyd算法原理是对于点k
= [1..n]
,尝试用它来松弛边(u, v)
。在实现时维护 $ dist[n][n] $ 数组,用来表示i
和j
之间可以通过$ 1..k $的最短路径。因此算法复杂度为 $ O(n^3) $ ,能计算任意两点最短路径,能够处理负边。
Floyd计算最小环时,考虑k
的两个邻居i和j,他们三者可以构成一个至少有三条边的环(其中实际不存在的边边权为无穷大)。
事实上查看算法可以发现计算最小环的操作位于Floyd算法k
循环松弛操作的上方,也就是在用k
松弛i
和j
前先计算经过k
的最小环,这么做是为了防止重复计算经过同一点的最小环。
注意点
- 一开始定义
const int inf
的时候不能设太大,不然容易wrap掉 - 遍历k要放在最外层