栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

一.概述

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

如图:

从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 nodes;   //辅助队列

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/821100.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号