如何确定删除给定周期是否会断开图表

时间:2015-10-09 11:05:41

标签: algorithm graph

我已经看到了在图表中检测循环的方法,但我仍然没有找到一种方法来检测“桥状”循环。因此,假设我们在连接(和无向)图中找到了一个循环。我们如何确定删除此循环是否会断开图形?通过删除循环,我的意思是删除循环中的边(因此顶点不受影响)。

一种方法是清除计算删除前后的组件数量。我只是想知道是否有更好的方法。

如果确实存在已建立的算法,有人可以请我指向相关的工作/论文/出版物吗?

3 个答案:

答案 0 :(得分:0)

这是天真的算法,复杂性明智,我不认为这是一种更有效的检查方法。

  • 从边缘列表开始( cycleEdges
  • cycleEdges cycleVertices )中获取顶点集
    • 如果 cycleVertices 中的顶点仅包含属于 cycleEdges 的边缘,则返回FALSE
  • 对于每个vetex In cycleVertices
    • 递归跟随不在 cycleEdges 中的顶点边缘(避免已经访问过的顶点)
      • 如果到达的顶点不在 cycleVertices 中,请将其添加到te set outsideVertices (停止递归搜索此路径)
    • 如果仅达到 cycleVertices 中的顶点,则返回FALSE
  • 如果 outsideVertices 包含1个元素,则返回TRUE
  • outsideVertices 中选择一个顶点,然后将其从 outsideVertices 中删除
    • 递归跟踪不在 cycleEdges 中的顶点边缘(避免已经访问过的顶点)(有利于选择 outsideVertices 中包含顶点的边来改善运行大图的时间)
      • 如果到达 outsideVertices 中的顶点,则将其从 outsideVertices 中删除
        • 如果 outsideVertices 为空,请返回TRUE
  • 返回FALSE

答案 1 :(得分:0)

你可以为E + V做到这一点。 您可以通过dfs +动态编程获取E + V图中的所有桥。

http://www.geeksforgeeks.org/bridge-in-a-graph

保存它们(只需make boolean [E],然后生效。 然后你可以说O(1)边缘是否是桥。 您可以从循环中获取所有边缘并验证它是否为桥接。

答案 2 :(得分:0)

Vish提到的衔接点绝对是正确的方向。可以说更多。可以通过修改后的DFS算法找到发音点,该算法如下所示:

执行DFS,为每个编号分配其DFS编号(例如,在其之前访问的节点数)。当遇到已经发现的顶点时,将其DFS编号与当前顶点进行比较,然后可以存储与此顶点关联的LOW编号(例如,该节点“看到”的最低DFS编号)。当您递归回到起始顶点时,可以将父顶点与孩子的LOW数字进行比较。当您进行递归操作时,如果父顶点看到子项的低数大于或等于其自己的DFS数,则该父顶点就是一个关节点。

我在这里经常使用“ child”和“ parent”作为描述符,因为在DFS树中,我们必须考虑根的特殊情况。如果它看到一个孩子的低数大于或等于其自己的DFS数,并且在树中有两个孩子,则第一个顶点是一个关节。

Here's a useful art. point image

另一个要熟悉的概念,特别是对于无向图,是双向连接的组件,也就是其顶点与所有其他顶点成一个周期的子图。

Here's a useful colored image with biconnected components

您可以证明任何两个双向连接的组件只能共享一个顶点最大值;两个“共享”的顶点意味着两个以及同一个组件中的所有其他顶点都处于一个循环中,因此这两个组件实际上是一个大组件。正如您在图中所看到的,由两个组件(具有不止一种颜色)共享的任何顶点都是关节点。因此,删除包含任何关节点的循环将断开图形。