Algorithm 如何输出无向图的所有双连通分量?

Algorithm 如何输出无向图的所有双连通分量?,algorithm,data-structures,graph-theory,depth-first-search,Algorithm,Data Structures,Graph Theory,Depth First Search,给定一个一般的无向图,我们如何在O(N+M)时间内打印该图的所有双连通分量?我知道Tarjan算法用于输出无向图的所有连接点,但我发现很难扩展该算法来打印双连接组件。我试着搜索谷歌,但我得到的所有结果都不能用于我的测试用例,因为它们错过了算法的边缘用例 有人能提供这个问题的工作代码吗 Def:biconnected组件是一个不包含顶点的连通子图,删除该顶点将断开该子图 编辑:我已经成功地实现了Niklas提供的中所述的算法。现在我有一个不同的问题,我如何找到一个无向图的子图,这个无向图不包含边,

给定一个一般的无向图,我们如何在O(N+M)时间内打印该图的所有双连通分量?我知道Tarjan算法用于输出无向图的所有连接点,但我发现很难扩展该算法来打印双连接组件。我试着搜索谷歌,但我得到的所有结果都不能用于我的测试用例,因为它们错过了算法的边缘用例

有人能提供这个问题的工作代码吗

Def:biconnected组件是一个不包含顶点的连通子图,删除该顶点将断开该子图

编辑:我已经成功地实现了Niklas提供的中所述的算法。现在我有一个不同的问题,我如何找到一个无向图的子图,这个无向图不包含边,删除边会断开子图。请帮我解决这个备用问题。

这是一个问题。不过,您可能需要首先将图形分解为连接的组件。Wikipedia中的算法说明:

计算双连通元件的经典序贯算法 在由John Hopcroft-andRobert引起的连通无向图中 Tarjan(1973)[1]以线性时间运行,基于深度优先 搜索。该算法也被概括为引言中的问题22-2 到算法(第二版和第三版)。这个想法是经营一家公司 深度优先搜索,同时维护以下信息: 深度优先搜索树中每个顶点的深度(一旦 对于每个顶点v,所有顶点中相邻顶点的最低深度 深度优先搜索树中v的后代,称为 最低点。深度是在深度优先期间保持的标准 搜索。v的低点可在访问所有 v的后代(即,就在v从 深度优先搜索堆栈)作为深度v的最小值 v的所有邻居中(除 深度优先搜索树)和 深度优先搜索树。关键的事实是,非根顶点v是 分离两个双连接的顶点(或连接点)的剖切点 当且仅当存在v的子y时 低点(y)≥ 深度(v)。此属性可以在 从v的每个子级返回的深度优先搜索(即 在v从深度优先搜索堆栈弹出之前),如果 如果为true,则v将图形分隔为不同的双连接组件。 这可以通过计算一个双连接组件来表示 每个这样的y(包含y的组件将包含子树 ,然后从树中删除y的子树 根顶点必须单独处理:它是一个切割顶点,当且仅当 如果它至少有两个孩子。因此,只需构建一个就足够了 根(包括根)的每个子子树之外的组件


一个好的伪代码实现可以在上找到。

看看这篇关于的博士论文

给出DFS算法(使用递归或迭代的两个版本)的伪代码,以及将DFS树(也称为Tremaux树)划分(分解)为路径段(或链)层次结构的算法。根据路径段尾部在DFS树中的连接位置(相对于路径段头部),将这些路径段分类为4种不同类型

通过这种分离,您可以将树划分为双连接组件,以便:

  • 1类路径段不是任何双连接组件的一部分
  • 第2类(减去线段头部之后和尾部之前的边和顶点,与第1类线段一样,这些边和顶点不是任何双连接组件的一部分)和第3类路径段形成一个循环,位于双连接组件的起点(根);及
  • 类4段是双连接组件的一部分,该组件包含其最新的类2或3祖先路径段
如果操作正确,您应该能够在O(V+E)时间内提取这些双连接组件


论文后面有Java源代码,它在O(V+E)时间和内存中进行了完整的平面性测试,这可能会给你一些进一步的指示(并提取O(p(V+E)中双连接组件嵌入的所有排列p)。

你说的“所有双连接组件”是什么意思?我不熟悉“双连接组件“在这里。要提供它吗?双连通图是一个没有连接点的连通图。所以基本上我想把一个无向图分成不同的最大子图,没有连接点。你能给我们一个你写的代码的例子来解决这个问题吗?这听起来像是家庭作业。wordpress链接中实现的算法不输出双连接组件,而只是检查图形是否有任何连接点。至于cs.umd链路,算法伪代码并不适用于所有情况。如果您有任何其他问题链接及其解决方案,请更新您的答案。@nikjnj您对wordpress代码的看法是正确的,这些示例足够小,人们可以使用暴力方法代替。请包括您的代码和一个示例,如果您在特定的实现中遇到问题,它将失败。这不是一个“给我代码”的wishboxthank you Niklas,我只是找到了我代码中的错误。伪代码非常好,我已经编写了算法()。但是niklas,你能不能帮我解决另一个问题,找到用桥而不是连接点分隔的图的双连通分量。更具体地说,我试图解决这个问题,它在这里有一个解决方案。解决方案要求我们找到双连接的组件