zoukankan      html  css  js  c++  java
  • 使用广度优先搜素查找路径

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

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

    实现方法

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

    取队列中的下一个顶点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;
        }
    
    }
  • 相关阅读:
    小米手机导出微信聊天记录
    IBM X3650 M4 微码升级(BIOS升级)
    leetcode1987 不同的好子序列数目
    leetcode1932 合并多棵二叉搜索树
    leetcode146 LRU 缓存机制
    leetcode456 132 模式
    leetcode316 去除重复字母
    GIT放弃本地所有修改,强制拉取更新
    vendor/easywechat-composer/easywechat-composer/src:
    微信公众号推广饿了么赏金红包制作
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9048148.html
Copyright © 2011-2022 走看看