stoer_wagner,在此用sw代替,算法利用两个引理判定最小割集的权值
任意在无向图G中选出s和t. 最小割的值要么等于以s和t为源汇点的最小割,要么等于将s和t缩点之后的全局最小割。
换句话就是,如果存在一个最小割,s和t分别在两个点集中,
那么s-t最小割就等于全局最小割(最小割),如果不是,那么s和t就在同一侧点集,
缩点之后肯定不影响最小割的求解。
*将s和t缩点的操作就是:
将新建一点 ,该点到任意点的边权等于s到该点的边权与t到该点的边权之和。
既然有了这个结论,那大体的算法框架就是:找任意s和t的最小割,然后缩点,总点数减一,重复n-1次之后,那么就剩下一个点,算法结束。
现在的难点就是如何在最短的时间内找到任意s和t之间的最小割大小。
引理2.初始集合A为空集,任意选择无向图中一点进入集合,开数组记录到达每一个点的边权和,边权和更新加上每次进入集合的点到达其他不在集合内的点的边权,然后每次从不在集合内的所有点中选择一点累计边权和最大的点进入集合,直至所有点进入A中,最后一个进入A的点为t,t之前一个进入集合的点为s,则t进入集合时的边权和就是s和t之间的最小割。