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