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 最小割