使用广度优先搜素查找路径
使用深度优先搜索可以找到一个顶点到其他顶点的路径,但该路径不一定是最短路径。
广度优先搜索可以找到点与点之间的最短路径。
实现方法
先将起点加入队列,让后重复一下步骤直到队列为空:
取队列中的下一个顶点v并标记它;
将与v相邻的所有未被标记的顶点加入队列。
示例:
首先顶点0加入队列中,然后开始循环搜索。
从队列中取出顶点0,将其相邻顶点2,1,5标记并加入队列,且将edgeTo[]数组中2,1,5位置设为0;
从队列中取出顶点2,相邻顶点0,1已经被标记,将相邻顶点3,4标记并加入队列,且将edgeTo[]数组中3,4位置设为2;
取出顶点1,其相邻顶点0,2已经被标记;
取出顶点5,其相邻顶点0,3已经被标记;
取出顶点3,其相邻顶点2,4,5已经被标记;
取出顶点4,其相邻顶点3,2已经被标记;
队列为空,结束。
实现代码
public class BreadthFirstPaths { private int s; private boolean[] marked; private int[] edgeTo; public BreadthFirstPaths(Graph G, int s) { this.s = s; marked = new boolean[G.V()]; edgeTo = new int[G.V()]; bfp(G, s); } private void bfp(Graph G, int s) { Queue<Integer> queue = new Queue<>(); queue.enqueue(s); marked[s] = true; while(!queue.isEmpty()) { int v = queue.dequeue(); for (int w:G.adj(v)) { if (!marked[w]) { marked[w] = true; edgeTo[w] = v; queue.enqueue(w); } } } } public boolean hasPath(int v) { return marked[v]; } public Iterable<Integer> hasPathTo(int v) { if (!marked[v]) return null; Stack<Integer> path = new Stack<>(); for (int x=v; x!=s; x=edgeTo[x]) path.push(x); path.push(s); return path; } }
posted on 2018-05-16 21:02 Deltadeblog 阅读(221) 评论(0) 编辑 收藏 举报