Problem
给定一个有向图,求一个至少经过2个点的最小环。
Solution
Floyd算法的代码如下
1
2
3
4for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
chkmn(sp[i][j],sp[i][k]+sp[k][j]);
外层循环执行完的循环,表示两两节点之间只走的最短路已经被求出。
考虑一个环,上面一定有一个编号最大的点
以上图为例,在第66次循环之前,所有点对经过的最短路已经求出,由于最短路中一定没有点,所以可以放心地尝试把号点加进去而不必担心出现重边。
于是算法就出来了:额外记录原图的边,在上求最短路。第次循环之前,枚举每对点,把连到和上,用这个环的大小来更新答案。
Code
1 | for(int k=1;k<=n;k++) |