【问题标题】:Find a cycle in an undirected graph (boost) and return its vertices and edges在无向图中找到一个循环(boost)并返回它的顶点和边
【发布时间】:2009-12-17 15:03:18
【问题描述】:

我需要一个函数,它可以在无向图中找到一个循环(提升)并返回它的顶点和边。它只需要返回图中一个循环的顶点/边。 我的问题是 - 使用 boost 执行此操作的最佳方法是什么?我没有使用它的经验。

【问题讨论】:

  • 告诉我们你如何在不使用 boost 的情况下解决它?

标签: c++ boost graph


【解决方案1】:

我不知道 Boost,但here 是 S.O. 的答案。在概念层面:

这是我的猜测:使用 BFS 遍历图表。在每个节点上记下它的“深度”并添加对“父”的引用(即使有很多循环也应该只有一个)。一旦您发现从 A 到 B 的链接创建了一个循环(因为 B 已经着色),那么: 1)从A回溯到根,沿途保存边/顶点。 2)从B回溯到根,沿途保存边/顶点。 3)添加A,B,AB 4)“排序”以恢复正确的顺序。考虑对 1) 使用 LIFO(堆栈),对 2) 使用 FIFO

我希望这会有所帮助。

【讨论】:

  • 不同的是我还需要找到循环中的所有顶点&边,而不是仅仅找到有循环。
  • 编辑:LIFO 和 FIFO 都可以使用。
【解决方案2】:

通常,您可以通过深度优先搜索来做到这一点。我对 boost 的绘图工具不是很熟悉,但this page 会给你一个算法的概述。

【讨论】:

    【解决方案3】:

    如果你想找到 a 循环,那么使用深度优先搜索应该就可以了。 DFS 访问者有一个 back_edge 函数。当它被调用时,你在循环中占有优势。然后,您可以通过前导图来重建循环。请注意:

    • strong_components 函数,用于查找强大的组件
    • 与循环相比,查找所有循环要困难得多,我相信 Boost.Graph 目前还没有实现这一点

    【讨论】:

    • 谢谢,我会试试的。你能稍微扩展一下前任地图吗?关于注释: * 我正在寻找一个无向图中的循环,所以 strong_components 对我没有帮助。 * 我一次只找一个周期(重点是以某种方式修复周期,然后重新检查,修复任何其他周期等)
    • Predecessor map 是一个可以传递给 depth_first_search 的参数,它告诉每个顶点“u”,当 DFS 第一次说“v”时,它来自哪个顶点。所以,你看到从 u' 到 u 的后边,你应该首先在前导图中查找 u' 以找到 u'',然后查找 u'' 以找到 u''',等等,直到你得到一个顶点等于你。如果您查看 libs/graph/example/bfs.cpp,您将了解如何要求创建前驱图 - 它对 dfs 和 bfs 的工作方式相同。
    猜你喜欢
    • 2015-06-24
    • 2014-02-08
    • 2015-07-13
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多