深度优先搜索(DFS)

时间:2021-08-30 01:25:19


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的路径

深度优先搜索(DFS)

深度优先搜索(DFS)

深度优先搜索(DFS)

深度优先搜索(DFS)

深度优先搜索(DFS)

深度优先搜索(DFS)

深度优先搜索(DFS)

深度优先搜索(DFS)

深度优先搜索(DFS)

深度优先搜索(DFS)

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. }