BGL - 确定所有mincuts

时间:2015-10-15 12:53:14

标签: c++ algorithm boost graph

给定一个图表,我想找到所有边缘(如果有的话),如果删除它会将图形分成两个部分。

最初的想法是为所有边分配权重1,然后计算图的最小值。 mincut> 1意味着没有单个边缘在被移除时导致分裂。

对于mincut == 1,如果算法为每个mincut提供它所包含的边缘,那就太好了。

不幸的是,BGL似乎不支持这种事情:

  

stoer_wagner_min_cut函数确切地确定了一个最小切割及其重量。

http://www.boost.org/doc/libs/1_59_0/libs/graph/doc/stoer_wagner_min_cut.html

有没有办法让这个工作(即确定多个小切割)与BGL或我必须提出不同的东西?

1 个答案:

答案 0 :(得分:0)

这可能会有点晚......

从我看到的你只需要找到不属于图中任何周期的所有边(假设图已经连接)。

这可以通过迭代删除叶节点(以及连接到它们的边)来完成,就像你在topological sorting中所做的那样,直到没有叶子节点离开,即剩下的每个边缘图表属于至少一个周期。在此过程中删除的所有边缘都将是您想要的边缘。

在伪代码中,对于连接的无向图G=(V,E),您可以这样做:

S = Ø
while(there exists a node n∈V s.t. degree(n)==1)
    e = edge connected to n
    S = S∪{e}
    E = E-{e}
    V = V-{n}
return S

可以在O(| V | + | E |)时间内完成