我正在浏览BOOST库并注意到他们有一个算法来查找图中的桥,他们确实有一个找到清晰点。无论如何,这可以有效地完成吗?
我有个主意:
1。使用BOOST查找关节点
2。使用out_edges,找到每个关节点附加的所有边
3。删除它们并计算连接组件的数量,(我假设我的图形最初是完全连接的),如果它超过1,我将此边缘添加到网桥。
问题:是否有必要将桥梁连接到关节点?我只是假设他们是,无法找到任何网络。
我还想知道如何处理这个问题。
我的另一种方法会更天真并采取O(v *(V + E)),这是非常糟糕的。
答案 0 :(得分:3)
整个图形重写听起来有点慢。您必须检查Boost是否将单连接顶点计为关节点。 (如果没有,这会使事情稍微复杂化。)
现在很明显,桥梁必须是两个铰接点之间的边缘,但并非铰接点之间的所有边缘都必然是桥梁。考虑由3个边连接的4个连接点链:A-b-c-D。现在添加一个连接到b和c的节点e。外部的两个桥仍然是桥梁,因此所有4个原始节点都保持铰接点,但中间节点不再是桥梁。
这意味着我们有一个必要但不充分的额外条件:边缘的两个节点必须是关节点。这里有轻微的复杂情况;如果Boost不将单连接节点计为关节点,则必须特别对待它们。但这仍然很简单;一个边缘必然是一座桥梁。
这种额外条件在密集图中非常有效,因为大多数节点不是关节点。因此,在尝试更改图形之前,您会剔除大多数候选边。其次,您不需要测试生成的更改图的组件数。您只需要在切割直接连接它们的边缘后检查两个铰接点是否仍然连接。
答案 1 :(得分:0)
当您意识到双连通组件是否仅包含一条边时,这种边是一座桥,有一种更简单的方法。使用boost(http://www.boost.org/doc/libs/1_58_0/libs/graph/example/biconnected_components.cpp)非常容易实现: