深度优先搜索(DFS)

来源:互联网 发布:java 中的super this 编辑:程序博客网 时间:2024/05/12 18:46

 

1.主要思想

深度优先搜索算法(Depth-First-Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。

2.方法步骤

1)选取图中某一顶点Vi为出发点,访问并标记该顶点;

2)以Vi为当前顶点,依次搜索Vi的每个邻接点Vj,若Vj未被访问过,则访问和标记邻接点Vj,若Vj已被访问过,则搜索Vi的下一个邻接点;

3)以Vj为当前顶点,重复步骤2),直到图中和Vi有路径相通的顶点都被访问为止;

4)若图中尚有顶点未被访问过(非连通的情况下),则可任取图中的一个未被访问的顶点作为出发点,重复上述过程,直至图中所有顶点都被访问。

3.实例

从v0出发查找一个长度为4的路径

clip_image002

clip_image004

clip_image006

clip_image008

clip_image010

clip_image012

clip_image014

clip_image016

clip_image018

clip_image020

4.代码

1. /**

2.  * DFS核心伪代码

3.  * 前置条件是visit数组全部设置成false

4.  * @param n 当前开始搜索的节点

5.  * @param d 当前到达的深度

6.  * @return 是否有解

7.  */

8. bool DFS(Node n, int d){ 

9. if (isEnd(n, d)){//一旦搜索深度到达一个结束状态,就返回true

10. return true

11.     } 

12.

13. for (Node nextNode in n){//遍历n相邻的节点nextNode

14. if (!visit[nextNode]){//

15.             visit[nextNode] = true;//在下一步搜索中,nextNode不能再次出现

16. if (DFS(nextNode, d+1)){//如果搜索出有解

17. //做些其他事情,例如记录结果深度等

18. return true

19.             } 

20.

21. //重新设置成false,因为它有可能出现在下一次搜索的别的路径中

22.             visit[nextNode] = false

23.         } 

24.     } 

25. return false;//本次搜索无解

26. } 

原创粉丝点击