检查给定网络流中是否有一个最小割减

时间:2014-07-05 07:13:48

标签: algorithm graph graph-algorithm network-flow

我正在寻找一种算法来检查给定网络流中是否存在最小切割信号。

我知道这是可能的,因为我们可以查找所有切割,并检查我们是否只有1个最小切割,但我想找到更有效的算法,它以多项式运行。

我想过使用max-flow算法来帮助我,但我没有成功。

1 个答案:

答案 0 :(得分:2)

我假设你指的是加权情况,如果没有 - 通过给所有边加权1,非加权可以很容易地减少到加权。

一种方法是找到一个最小切割,让它成为分裂U1,U2,然后对于来自U1的每对顶点u1和来自U2的u2,使得(u1,u2)处于E - 检查是否通过稍微增加重量w(u1,u1) - 仍然有一个具有相同值的最小切口。
最后,当且仅当你发现一条边缘使得最小切割值仍然存在时 - 有超过一分钟的切割。

高级伪代码:

value,U1,U2 = min-cut(G) //value is the minimum cut value, U1,U2 are the cuts
for each u1 in U1 and u2 in U2 such that (u1,u2) is in E:
   temp <- w(u1,u2)
   w(u1,u2) <- w(u1,u2) + epsilon
   new_value,_,_ = min-cut(G)
   if (new_value == value): //2+ cuts with same value
        return true
   //roll back the changed weight
   w(u1,u2) <- temp
return false //no cuts with same value found

复杂度为O(E*min-cut),其中min-cut是使用的最小切割algorirthm的复杂性