最近看sw最小割的论文,想把自己的理解写下来,算是对最近的一个总结吧。
1:基本概念:
割:在一个图G(V,E)中V是点集,E是边集。在E中去掉一个边集C使得G不连通,C就是图G的一个割;
最小割:在G(V,E)的所有割中,边权总和最小的就是最小割
全局最小割:删掉无向图中的边使得其不连通的最小代价 或在一个无向图中任取S和T,求最小割的最小值
2:sw算法的用途:
Stoer-Wagner 算法用来求无向图 G=(V, E)的全局最小割
3:sw算法的思想:
sw的核心思想是迭代缩小规模:
设s和t是图G的2个顶点,图G的全局最小割要么是s-t的最小割,此时s和t在G的全局最小割的2个不同的子集中,或者是G中将s和t合并得的的新图G'的全局最小割,此时s和t在G的全局最小割的同一个子集中。所以只需要不断求出当前图中任意2个点的最小割,然后合并这2个点。不断缩小图的规模求得最小割
伪代码;
while |V|!=1:
while A!=V:
A= {}
A = {a}, #任选G中一点a到集合A中,
定义W(A, p)为A中的所有点到A外相邻一点p的权总和.选出最大的W(A,P) ,并将p点加入到集合A中,
把最后进入A的两点记为s和t,其中s是倒数第二个被集合A中的点,t是倒数最以后一个进入集合点
把最后一个顶点t合并到倒数第二个顶点s中即:新建顶点U 边权w(u, A)=w(s, A)+w(t, A) 删除顶点s和t, 以及与它们 相连的边
更新图G(V,E) 即更新 V
4:代码会最近补上来。