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

本文详细介绍了广度优先搜索(BFS)的概念,它在图遍历中遵循先找兄弟节点后找子节点的规则。通过一个实例展示了从顶点0开始如何找到所有相通顶点的过程。同时,给出了Java实现BFS的代码示例,包括使用辅助队列进行节点的存储和遍历,并提供了检查顶点是否相通以及获取相通顶点数量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.概述

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

如图:
在这里插入图片描述
从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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值