DFS是我们非常熟悉的算法,并且在图当中 也有很多应用。DFS的递归写法大家都很清楚,非常简单并且简洁。这里我们要讨论的是怎么用循环的方法实现图的DFS遍历。
既然要用循环模拟递归,我们肯定是需要用到stack的。具体的思路是,对于给定的图,选定任意节点为起始节点:
- 起始节点入栈并标记
- 如果栈不为空:
- 访问栈顶节点v
- 选择一个v没有被标记过的邻接节点,标记并入栈
- 如果v没有未被标记的邻接节点,pop栈顶节点
- 重复以上三步直到栈为空
- 完毕
具体到每一步的话,以下图为例:
图一
我们选择0为初始节点,入栈并标记
图二,stack = {0}
访问栈顶节点0,其邻接节点2未被标记,2入栈并标记
图三,stack = {0, 2}
访问栈顶节点2,其邻接节点1未被标记,1入栈并标记
图4,stack = {0, 2, 1}
访问栈顶节点1,没有未被标记的邻接节点,pop, stack = {0, 2}
访问栈顶节点2,其邻接节点3未被标记,3入栈并标记
图5,stack = {0, 2, 3}
访问栈顶节点3,没有未被标记的邻接节点,pop, stack = {0, 2}
访问栈顶节点2,没有未被标记的邻接节点,pop, stack = {0}
访问栈顶节点1,没有未被标记的邻接节点,pop, stack = {}
栈为空,算法结束。
时间复杂度O(V + E),空间复杂度O(V)。代码如下:
No comments:
Post a Comment