【问题标题】:Finding Bridges in a graph C++ (BOOST)?在图形 C++ (BOOST) 中寻找桥梁?
【发布时间】:2015-01-22 04:43:00
【问题描述】:

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

我有个主意:

1. 使用 BOOST 查找关节点

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

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

问题:是否有必要将桥梁连接到关节点?我只是假设他们是,找不到任何没有网络的东西。

我也想知道如何解决这个问题。

我的其他方法会更幼稚,采用 O(v*(V+E)),非常糟糕。

【问题讨论】:

    标签: c++ boost graph theory bridge


    【解决方案1】:

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

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

    这意味着我们有一个必要但不充分的额外条件:边缘的两个节点都必须是关节点。这就是轻微的复杂性所在;如果 Boost 不将单连接节点算作关节点,则必须对它们进行特殊处理。但这仍然很简单;一条边必然是一座桥。

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

    【讨论】:

    • 我有点不清楚,所以你说我只需要检查边缘整个末端都是关节点吗?
    • @LoveMeow:试验一个有两个节点和一个边的平凡图。如果 Boost 将两个节点都算作关节节点,那么是的。如果 Boost 不将它们算作关节节点,那么您需要对图形进行预处理(但这更有效)。迭代地,枚举所有单连接节点,将它们的单边标记为桥,删除该边,然后再次检查。 (这会迭代地修剪所有边都是桥的线性链)
    • 我查过了,boost 并没有在关节点计算它们!所以我需要枚举所有只连接到一条边的节点,并将它们标记为桥,除了两个关节点之间的桥?
    • 是的,正确的。请记住,“在两个关节点之间”是必要的,但还不够。
    【解决方案2】:

    当你意识到如果一个双连通组件只包含一条边时,有一种更简单的方法,这条边就是一座桥。使用 boost (http://www.boost.org/doc/libs/1_58_0/libs/graph/example/biconnected_components.cpp) 很容易实现:

    1. 计算双连通分量
    2. 为每个组件创建一个边缘计数器。迭代所有边缘并增加相应组件的对应边缘计数器
    3. 再次遍历所有边,检查相应组件的边计数器是否为 1,如果是,则此边为桥

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 2012-02-12
      • 2011-08-26
      相关资源
      最近更新 更多