无向图的广度优先搜索(BFS)

导读:本篇文章讲解 无向图的广度优先搜索(BFS),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一.概述

所谓的广度优先搜索,指的是在搜索时,如果遇到一个结点既有子结点,又有兄弟结点,那么先找兄弟结点然后找子结点

如图:
在这里插入图片描述
从0开始,想找与0相同通的所有顶点。
从0开始,搜索到6, 6有兄弟节点 2、1、5, 找完了兄弟节点再找子节点,找到6的邻接表,0搜过,找4的子节点
然后分别遍历2、1、5邻接表 …

回顾二叉树的层序遍历
从上到下打印二叉树

  1. nodes先存root节点
  2. 开始循环: poll()弹出nodes的一个节点,其key放que
  3. 将弹出节点的左、右子结点放入nodes

二.概述

 public class graphBFS {
    private boolean[] marked;
    private int count;
    private Queue<Integer> nodes;   //辅助队列

    public graphBFS(graph g, int s) {
        this.count = 0;
        this.marked = new boolean[g.V()];
        nodes = new LinkedList<Integer>(); //辅助队列
        bfs(g, s);
    }

    public void bfs(graph g, int v) {    //使用广度优先搜索找出与v相通的顶点
        //标记当前顶点为已搜索
        marked[v] = true;
        //让v进入队列待搜索
        nodes.add(v);
        //通过循环,如果队列不为空则从队列中弹出一个待搜索的顶点进行搜索
        while (!nodes.isEmpty()) {
            //弹出一个待搜索的顶点curr
            Integer curr= nodes.poll();
            //遍历curr顶点的邻接表
            for (Integer k : g.adj(curr)) {
                if (!marked(k)) {
                    nodes.add(k); //将未搜索过的顶点添加至nodes队列
		            marked[k]=true;   //对搜索过的节点进行标记
                }
            }
        }
        count++;

    }

    public boolean marked(int w) {
        return marked[w];  //返回数组中那个顶点是否与s顶点相同
    }

    public int count() {  //获取与顶点s相通的所有顶点的总数
        return count;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89346.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!