通过非递归DFS的关节点

时间:2014-01-24 11:12:13

标签: graph graph-algorithm

我想通过非递归方法找到一些方法来查找root是否是一个关节点。通过递归方法,我们可以递归地查找root的非连接子节点数。但是如果没有递归,我找不到办法做到这一点。

1 个答案:

答案 0 :(得分:1)

我能够编写一个我认为可能正在运行的算法。在这里:

我们有四个状态的任何顶点。不受欢迎,访问,访问,重新审视。我们保留了一个父数组和一个可以计算未连接子数的数组。

  1. 我们继续从root开始向堆栈添加顶点,但我们不会弹出父元素。例如,我们将根1连接到2,3,6,7然后我们将1推到堆栈但不要弹出它。相反,我们推动其他孩子。而且我们也为每个元素维护父亲。例如,2,3,6,7有1个作为他们的父亲。

  2. 我们将堆栈上的节点标记为VISITING(如果它们是UNVISITED)。

  3. 如果在任何节点邻接列表的遍历期间我们发现某个元素处于访问状态,我们将其状态设置为REVISITING,但前提是该元素不是它的父亲。例如,首先,2,3,6,7处于访问状态。现在,如果7的邻接列表是1,3,5,10,8,12,那么因为1是它的父亲,所以我们不改变1的状态。我们转到3并且看到它的状态为VISITING而且它不是7的爸爸,我们制作它的状态是REVISITING。到目前为止,堆栈从​​下到上依次为1,2,3,6,7,5,10,8,12。

  4. 现在,如果我们遇到其邻接列表中没有UNVISITED元素的任何元素,如果此元素的状态为VISITING状态(不是REVISITING),我们将其父亲的子节点总数加1(初始化为0)。如果处于REVISITING状态,我们会忽略将其父亲的子女数添加1。我们也将这个元素从堆栈中弹出并使其状态为VISITED。

  5. 逐渐弹出元素,我们到达root的子节点(连接或唯一)。我们在步骤4检查以计算根的唯一未连接子节点的数量。如果它大于1,那么root就是一个发音点。

  6. 这个算法似乎有点复杂但似乎有效。欢迎任何建议或问题。