使用广度优先搜素查找路径

使用深度优先搜索可以找到一个顶点到其他顶点的路径,但该路径不一定是最短路径。

广度优先搜索可以找到点与点之间的最短路径。

 

 

实现方法

先将起点加入队列,让后重复一下步骤直到队列为空:

取队列中的下一个顶点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编辑  收藏  举报

导航