BGL - 确定所有的mincuts

Posted

技术标签:

【中文标题】BGL - 确定所有的mincuts【英文标题】:BGL - determine all mincuts 【发布时间】:2015-10-15 12:53:13 【问题描述】:

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

最初的想法是为所有边分配 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 来完成这项工作(即确定不止一个 mincut),还是我必须想出一些不同的方法?

【问题讨论】:

所以你想找到所有的切割都只有一条边?我希望 boost 支持检查连通性,因此如果仅删除该边,您应该能够检查每个边是否保持连接。或者,Tarjan's algorithm to find bridges 会更快;也许检查一下是否在boost中实现,或者你可以自己实现它,它的描述似乎并不复杂。 检查每个边缘的连接性不是一个巨大的开销吗?感谢塔扬。但是,如果我后来想修改算法以检查 - 在没有桥的情况下 - 对(e0,e1)边的删除会分裂图形怎么办?每个边缘不能很好地运行一次 tarjan,可以吗? 在这种情况下你想要k-connectivity,这通常可以使用流网络解决,但我不确定如何有效地检查所有 k 边删除的集合,这会断开图表。也许对于biconnectivity 有一些东西,但你必须调查一下。 【参考方案1】:

这可能来得有点晚……

据我所知,您只需要找到图中不属于任何循环的所有边(假设图已经连接)。

这可以通过迭代删除叶节点(以及连接到它们的边)来完成,就像你在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|) 时间内完成

【讨论】:

以上是关于BGL - 确定所有的mincuts的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1797: [Ahoi2009]Mincut 最小割

BZOJ-1797Mincut 最小割 最大流 + Tarjan + 缩点

BZOJ 1797: [Ahoi2009]Mincut 最小割

BGL 顶点上的随机顺序迭代

在 Delphi 7 中使用 C++ Boost 图形库 (BGL)

BGL:以不会失效的方式存储顶点描述符