最小割问题——精选推荐

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最⼩割问题
0 数学定义
对于有向图来说,我们设有向图G=(V,E),其中每条从u指向v的边<u,v>∈E,并且这样的边的容量为c(u,v)>0,这样的图称为流⽹络,⼀般的⽹络图会有⼀个源点s和汇点t。

实际⽣活中的电流,⽔流,物流等模型问题都可以抽象为流⽹络。

接下来我们阐明流的概念,它实质上是⼀个满⾜从V×V→R映射,且f(u,v)≤c(u,v),f(u,v)=-f(v,u)的函数f,当u不属于s和t时,则:
然后再说说残留⽹络吧,对于给定的⽹络G和流f,我们有:
最后引⼊增⼴路径的定义:设p为残留⽹络上s到t的⼀条简单路径。

该路径的残留容量,为可以沿该路径增加的最多额外流量,该流量严格⼤于零:
最后我们引⼊割的定义,它将图G分为S,T两部分,使得s∈S,t∈T,设f(S,T)为穿过S到T的流,容量定义为c[S,T],最⼩割也就是c[S,T]最⼩的割。

我们总结上⾯f与c[S,T]有:
最后由最⼤流最⼩割定理我们可知道当f是G的⼀个最⼤流时,它的残留⽹络不存在增⼴路径,并且存在⼀个最⼩割使
得|f|=c[S,T]。

对于⼀般的⽆向图G(V,E)⽽⾔不含有源汇点,定义G的最⼩割为把V分为两部分c[S,T],对于⽆权边,使得连接S和T的边的数量最⼩,等价于权值为1;如果边有权重,则是使得连接S和T的边的权值之和最⼩。

这样的最⼩割也被称为⽆向图的全局最⼩割。

1 解决⽅案
对于有向图,我们很快可以由最⼤流最⼩割定理的证明过程可得到怎么构造最⼩割的S与T两个点集,⾸先求得图的最⼤流,然后从s出发DFS遍历所有可到达的点组成了点集S,则T=V-S,从⽽得到最⼩割的值。

这样转到求最⼤流的算法的思路了。

对于⽆向图,我们利⽤了Prim的贪⼼思想,每次加⼊最长路径的点,我们定义W(A, p)为A中的所有点到集合A外⼀点p的权值的和,设⽆向图为G(V,E):
①初始化最⼩割min_cut=+∞;
②集合A={a},a为V中任意顶点;
③更新W(A,x),选取V-A中的W(A, x)最⼤的点x加⼊集合A,重复前⾯直到|A|=|V|。

设倒数第⼆个加⼊A的点为s,添加s后的集合A设为集合B,最后⼀个加⼊A的点为t;
④更新min_cut=min(min_cut,W(B,t));
⑤新建顶点c, 添加到V,权值w(c,v)=w(v,c)=w(s,v)+w(t,v), 删除顶点s和t, 以及与这两点相连的边;
⑥如果此时|V|>1则转②;
该算法就是stoer-wagner算法,时间复杂度为O(V*V*V),C++代码如下:
//Created by pritry
int stoer_wagner()
{
int i, j, k, s, t, st_min_cut;
memset(remove, 0, sizeof(remove));
int min_cut = INF;
for (i = 0; i < N - 1; i++)
{
int max_weight, max_index;
memset(visit, 0, sizeof(visit));
memset(weight, 0, sizeof(weight));
s = t = -1;
for (j = 0; j < N; j++)
{
max_weight = -INF;
for (k = 0; k < N; k++)
{
if (!remove[k] && !visit[k] && weight[k] > max_weight) {
max_index= k;
max_weight = weight[k];
}
}
if(t == max_index) break;
s = t; t = max_index;
st_min_cut = max_weight;
visit[tmp] = 1;
for (k = 0; k < N; k++)
{
if (!remove[k] && !visit[k]) weight[k] += graph[tmp][k]; }
}
if(st_min_cut < min_cut) min_cut = st_min_cut;
remove[t] = true;
for (j = 0; j < N; j++)
{
if (!remove[j])
{
graph[s][j] += graph[t][j];
graph[j][s] += graph[j][t];
}
}
}
return min_cut;
}。

相关文档
最新文档