【发布时间】:2009-12-17 15:03:18
【问题描述】:
我需要一个函数,它可以在无向图中找到一个循环(提升)并返回它的顶点和边。它只需要返回图中一个循环的顶点/边。 我的问题是 - 使用 boost 执行此操作的最佳方法是什么?我没有使用它的经验。
【问题讨论】:
-
告诉我们你如何在不使用 boost 的情况下解决它?
我需要一个函数,它可以在无向图中找到一个循环(提升)并返回它的顶点和边。它只需要返回图中一个循环的顶点/边。 我的问题是 - 使用 boost 执行此操作的最佳方法是什么?我没有使用它的经验。
【问题讨论】:
我不知道 Boost,但here 是 S.O. 的答案。在概念层面:
这是我的猜测:使用 BFS 遍历图表。在每个节点上记下它的“深度”并添加对“父”的引用(即使有很多循环也应该只有一个)。一旦您发现从 A 到 B 的链接创建了一个循环(因为 B 已经着色),那么: 1)从A回溯到根,沿途保存边/顶点。 2)从B回溯到根,沿途保存边/顶点。 3)添加A,B,AB 4)“排序”以恢复正确的顺序。考虑对 1) 使用 LIFO(堆栈),对 2) 使用 FIFO
我希望这会有所帮助。
【讨论】:
通常,您可以通过深度优先搜索来做到这一点。我对 boost 的绘图工具不是很熟悉,但this page 会给你一个算法的概述。
【讨论】:
如果你想找到 a 循环,那么使用深度优先搜索应该就可以了。 DFS 访问者有一个 back_edge 函数。当它被调用时,你在循环中占有优势。然后,您可以通过前导图来重建循环。请注意:
strong_components 函数,用于查找强大的组件【讨论】: