C++ 算法:非铰接顶点

C++ 算法:非铰接顶点,c++,c,algorithm,graph,C++,C,Algorithm,Graph,图G的一个连接顶点是一个删除的顶点 设G是一个有n个顶点和m条边的图。打 一种简单的O(n+m)算法求G的一个顶点 铰接顶点——即,其删除不会断开G 假设初始顶点数为n,那么在移除一个顶点后,我们应该有n-1条边。 我使用dfs遍历图形并计算顶点数。如果计数小于n-1,则它是一个铰接顶点,因此我将其加回去。 否则它不是,我增加一个计数器 有什么更好的方法可以找到非关节顶点,因为这种方法非常慢,我需要O(n+m)。使用DFS(深度优先搜索)是一个很好的开始,因为它本身已经是一个O(V+E)。因此,

图G的一个连接顶点是一个删除的顶点 设G是一个有n个顶点和m条边的图。打 一种简单的O(n+m)算法求G的一个顶点 铰接顶点——即,其删除不会断开G

假设初始顶点数为n,那么在移除一个顶点后,我们应该有n-1条边。 我使用dfs遍历图形并计算顶点数。如果计数小于n-1,则它是一个铰接顶点,因此我将其加回去。 否则它不是,我增加一个计数器

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

使用DFS(深度优先搜索)是一个很好的开始,因为它本身已经是一个O(V+E)。因此,我们的想法是遍历一次图,并能够计算出它的属性。旁注:每当做图形算法时,都会思考周期

证明铰接顶点合理的条件(在DFS的思维方式下):

  • 根节点是一个连接点iff它有多个子节点

  • 叶子永远不是一个连接点

  • 非叶、非根节点
    u
    是一个连接点iff
    u
    的某个子树下,没有非树边在
    u
    上方

  • 这涵盖了所有情况:根节点、叶子以及介于两者之间的任何其他节点


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

  • 根节点是一个非连接点iff它有一个子节点
  • 叶始终是非连接点
  • 非叶、非根节点
    u
    是一个非连接点iff
    u
    的某个子树上有一条非树边
  • 数字3可以理解为:如果两个拆分树之间存在另一个连接(按节点
    u
    ),也称为循环



    。你可能想调整一下。

    回答得很好。我想说的是,您从某个地方运行DFS,如果您找到一条到“已访问”节点的边,那么该已访问节点(或您所在的节点)可以作为答案返回+1.