算法:非关节顶点

时间:2015-08-06 03:32:37

标签: c++ c algorithm graph

  

图G的关节顶点是删除的顶点   断开G.设G是具有n个顶点和m个边的图。给一个   用于求G的顶点的简单O(n + m)算法   关节顶点 - 即。 ,其删除不会断开G.

让首先没有。顶点为n,然后在移除顶点后,我们应该有n-1个边。 我使用dfs遍历图表并计算否。顶点。如果计数小于n-1,则它是关节顶点,所以我将其添加回来。 否则它不是,我增加一个柜台。

找到非关节顶点的更好方法,因为这种方法非常慢,我需要O(n + m)。

1 个答案:

答案 0 :(得分:3)

使用DFS(深度优先搜索)是一种很好的开始方式,因为它本身已经是O(V + E)。因此,我们的想法是遍历图表一次,并能够找出其属性。旁注:每当进行图形算法时认为 循环

证明清晰度顶点的条件(在DFS的心态下):

  1. 根节点是一个关联点 iff 它有多个孩子

  2. Leaf 永远不是一个发音点

  3. 非叶子,非根节点 u是一个关节点 iff 没有非树边缘超过u来自某个u

  4. 的孩子下面的子树

    这涵盖了所有情况:根节点,叶子和其间的任何其他节点。

    对于非关节顶点,我们只需要找到证明相反的条件:

    1. 根节点是非关节点 iff 它有一个孩子
    2. Leaf 始终是非关节点
    3. 非叶子,非根节点 u是非关节点 iff 非树边缘超过{{1} }来自u
    4. 的某个孩子下面的子树

      数字3可以理解为:如果节点u a.k.a。之间的两个分裂树之间存在另一个连接。

      Here is some articulation vertex code。你可能想要调整一下。