内容简介:要搜索一幅图,用一个递归方法来遍历所有顶点。在访问其中一个顶点时:给定一幅图,回答“两个给定的顶点是否连通?”或者“图中有多少个连通子图?”给定一幅图和一个起点
要搜索一幅图,用一个递归方法来遍历所有顶点。在访问其中一个顶点时:
- 将它标记为已访问
- 将它添加到路径当中去
- 递归地访问它的所有没有被标记过的邻居顶点
相关问题
连通性
给定一幅图,回答“两个给定的顶点是否连通?”或者“图中有多少个连通子图?”
单点路径
给定一幅图和一个起点 s
,回答“从 s
到给定目的顶点 v
是否存在一条路径?如果有,找出这条路径。”
搜索轨迹
- 如图所示,起点为
0
- 因为顶点
2
是0
的邻接表第一个元素且没被标记过,dfs()
递归标记并访问2
- 对于顶点
2
,顶点0
为其邻接表第一个元素,但是它已经被标记,所以跳过。所以dfs()
标记并访问邻接表中第二个顶点1
- 对于顶点
1
,其邻接表中的所有顶点已经都被标记过,因此不再需要递归,方法从dfs(1)
中返回。接下来访问的是2
的邻接表中1
后面的顶点3
- 对于顶点
3
,顶点5
是3
的邻接表中未被标记的第一个元素,于是标记并访问顶点5
- 对于顶点
5
,邻接表中顶点都已经标记过了,于是不再递归 - 顶点
4
是3
的邻接表中下一个没被标记的顶点,于是标记并访问4
.这是最后一个需要被标记的顶点 -
dfs()
检查4
、3
、2
、0
的邻接表,因为都被标记过所以不再进行递归
寻找路径
edgeTo[]
数组用于记录从起点 s
到目标点 v
路径中 v
的前一个顶点。
如对于一条路径 s-a-b-c-v
, edgeTo[v]=c
。
这样对于 s
到 v
,迭代获取 edgeTo[]
中的顶点就可以得到路径。
路径记录详细过程如下图所示:
代码
public class DFS { private boolean[] marked; //此顶点上是否调用过dfs() private int[] edgeTo; //从起点到一个已知路径上最后一个顶点 private int s; //起点 public DFS(Graph G, int s) { marked = new boolean[G.V()]; edgeTo = new int[G.V()]; this.s = s; dfs(G, s); } private void dfs(Graph G, int v) { marked[v] = true; for (int w : G.adj(v)) { if (!marked[w]) { edgeTo[w] = v; dfs(G, w); } } } public boolean hasPathTo(int v) { return marked[v]; } public Iterable<Integer> pathTo(int v) { if (!hasPathTo(v)) return null; Stack<Integer> pathReverse = new Stack<>(); for (int x = v; x != s; x = edgeTo[x]) pathReverse.push(x); pathReverse.push(s); Queue<Integer> path = new LinkedList<>(); while (!pathReverse.isEmpty()) path.offer(pathReverse.pop()); return path; } }
以上所述就是小编给大家介绍的《深度优先搜索》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML 5实战
陶国荣 / 机械工业出版社 / 2011-11 / 59.00元
陶国荣编著的《HTML5实战》是一本系统而全面的HTML 5教程,根据HTML 5标准的最新草案,系统地对HTML 5的所有重要知识点进行了全面的讲解。在写作方式上,本书以一种开创性的方式使理论与实践达到极好的平衡,不仅对理论知识进行了清晰而透彻的阐述,而且根据读者理解这些知识的需要,精心设计了106个完整(每个案例分为功能描述、实现代码、效果展示和代码分析4个部分)的实战案例,旨在帮助读者通过实......一起来看看 《HTML 5实战》 这本书的介绍吧!
随机密码生成器
多种字符组合密码
HEX CMYK 转换工具
HEX CMYK 互转工具