c++ - 在图形 C++ (BOOST) 中寻找桥梁?

标签 c++ boost graph theory bridge

我正在阅读 BOOST 库并注意到他们有一种算法可以在图中找到桥,他们确实有一个可以找到接合点的算法。无论如何,这可以有效地完成吗?

我有一个想法:

1.使用BOOST寻找发音点

2.使用out_edges,找到连接到每个关节点的所有边

3. 删除它们并计算连接组件的数量,(我假设我的图最初是完全连接的),如果它超过 1,我将这条边添加到桥上。

问题:是否有必要将桥连接到铰接点?我只是假设它们是,没有找到任何东西。

我也想知道如何处理这个问题。

我的其他方法会更天真并采用 O(v*(V+E)),这是非常糟糕的。

最佳答案

重写整个图表听起来有点慢。您必须检查 Boost 是否将单连接顶点计为关节点。 (如果不是,这会使事情稍微复杂化)。

现在很明显,桥必须是两个关节点之间的边,并非关节点之间的所有边都一定是桥。考虑由 3 条边连接的 4 个关节点链:A-b-c-D。现在添加一个连接到 b 和 c 的节点 e。外面的两个桥仍然是桥,因此所有 4 个原始节点仍然是关节点,但中间节点不再是桥。

这意味着我们有一个必要但不充分的额外条件:边的两个节点都必须是关节点。这是稍微复杂的地方;如果 Boost 不将单连接节点视为关节点,则必须特殊对待它们。但这仍然很简单;一条边必然是一座桥。

这个额外条件在密集图中非常有效,因为大多数节点都不是关节点。结果,您在尝试更改图形之前剔除了大多数候选边。其次,您不需要测试生成的更改图的组件数。您只需要检查直接切割连接它们的边后两个关节点是否仍然连接。

关于c++ - 在图形 C++ (BOOST) 中寻找桥梁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27105367/

相关文章:

c++ - 在 Fortran 程序中使用 Boost 图形库 (BGL)

graph - gnuplot - 轻微抽动未出现

c++ - ECDSA 未正确签名/验证

c++:特征库新手排序

c++ - Boost::Spirit:优化表达式解析器

c++ - 解释 QStandardItem 和 QStandardItemModel 的父/子行/列关系

C++:嵌套映射

c++ - spirit X3 : Custom number parser yield unexpected leading zero in the result

javascript - 用鼠标悬停创建 map 的最佳方法是什么?

mysql - 组合数据以生成图形中的路线。从哪儿开始?