Graph 通过非递归DFS的关节点

Graph 通过非递归DFS的关节点,graph,graph-algorithm,Graph,Graph Algorithm,我想通过非递归的方法找到根是否是一个连接点的方法。通过递归的方法,我们可以递归地找到根的非连通子节点的数目。但是我没有找到一种没有递归的方法来实现这一点。我能够编写一个我认为可能有效的算法。下面是: 任何顶点都有四种状态。未访问、访问、访问、重访。我们保存了一个dad数组和一个保存未连接子节点计数的数组 我们继续从根开始向堆栈添加顶点,但我们不会弹出父元素。例如,我们将根1连接到2,3,6,7,然后将1推到堆栈中,但不弹出它。相反,我们把其他孩子推到它上面。我们还为每个元素维护dad。例如,2,

我想通过非递归的方法找到根是否是一个连接点的方法。通过递归的方法,我们可以递归地找到根的非连通子节点的数目。但是我没有找到一种没有递归的方法来实现这一点。

我能够编写一个我认为可能有效的算法。下面是:

任何顶点都有四种状态。未访问、访问、访问、重访。我们保存了一个dad数组和一个保存未连接子节点计数的数组

  • 我们继续从根开始向堆栈添加顶点,但我们不会弹出父元素。例如,我们将根1连接到2,3,6,7,然后将1推到堆栈中,但不弹出它。相反,我们把其他孩子推到它上面。我们还为每个元素维护dad。例如,2,3,6,7有1个作为他们的父亲

  • 如果未访问堆栈上的节点,则将其标记为正在访问

  • 如果在任何节点邻接列表的遍历过程中,我们发现某个元素处于访问状态,我们将重新访问它的状态,但前提是该元素不是它的父元素。最重要的是,2、3、6、7都处于访问状态。如果7的邻接列表是1,3,5,10,8,12,那么因为1是它的父亲,所以我们不改变1的状态。我们去3号,看到它的状态是访问,也不是7号的爸爸,我们把它的状态变成再次访问。现在堆栈从下到上依次为1、2、3、6、7、5、10、8、12

  • 现在,如果我们遇到任何元素,其邻接列表中没有未访问的元素,如果该元素的状态是访问状态(而不是重新访问),我们将1添加到其父亲的子元素总数中(初始化为0)。如果它处于重游状态,我们会忽略在它父亲的孩子号码上加1。此外,我们将该元素从堆栈中弹出,并使其状态被访问

  • 渐渐地,我们接触到根的孩子们(连接的或独特的)。我们通过步骤4进行检查,以计算根的唯一未连接子级的数量。如果其大于1,则根是关节点


  • 这个算法似乎有点复杂,但似乎是可行的。欢迎提出任何建议或问题。

    本网站是针对编程问题的,这听起来更像是一个理论问题。我只想获得上述问题的算法。