当前位置: 首页 > news >正文

算法-图-数据结构(邻接矩阵)-BFS广度优先遍历

邻接矩阵广度优先遍历(BFS)是一种用于遍历或搜索图的算法,以下是具体介绍:

1. 基本概念
    图是一种非线性的数据结构,由顶点和边组成,可分为无向图、有向图、加权图、无权图等。邻接矩阵是表示图的一种数据结构,是一个二维数组,其中行和列都对应图中的顶点。如果顶点i与顶点j之间存在一条边,则矩阵的第i行第j列的元素为1;否则为0[^4^]。
    广度优先搜索是一种遍历或搜索图的算法,它按照从根节点到最远节点的层次顺序进行搜索。在邻接矩阵中,BFS可以使用队列实现。

2. 算法步骤
  2.1 初始化队列,用于存储待访问的节点,并将起点加入队列。
  2.1 标记已访问节点,通常使用一个数组来记录每个节点是否已被访问过,以避免重复访问。
  2.3从队列中取出一个节点,检查该节点是否为目标节点。如果是,则搜索结束;如果不是,将其所有未访问的邻接节点加入队列,并标记为已访问。
   重复步骤3,直到队列为空或找到目标节点

3.算法实现

图数据结构定义

package com.example.demo;
//邻接矩阵广度优先遍历
public class YuGraph {
    private String[] v;
    private int[][] vG;
    //默认空构造
    YuGraph(){

    }
    //初始赋值构造
    YuGraph(String[] v,int [][] vG ){
        this.v=v;
        this.vG=vG;
    }

    public String[] getV() {
        return v;
    }

    public void setV(String[] v) {
        this.v = v;
    }

    public int[][] getvG() {
        return vG;
    }

    public void setvG(int[][] vG) {
        this.vG = vG;
    }
}

BFS算法实现

package com.example.demo;

import java.util.ArrayDeque;
import java.util.List;
import java.util.Queue;

//广度优先遍历
public class YuTestBFS {
    //插入变的关系
    public static void insertBian(int [][] a, int i,int j)
    {
        a[i][j]=1;
    }
    public static void bfsCreate()
    {
        //创建顶点
        String[] v=new String[]{"A","B","C","D","E"};
        //创建边
        int [][] vG=new int[v.length][v.length];
        //插入ab,bc,be,cd
        insertBian(vG,0,1);
        //bc
        insertBian(vG,1,2);
        //be
        insertBian(vG,1,4);
        //cd
        insertBian(vG,2,3);
        //创建邻接矩阵
        YuGraph graph=new  YuGraph(v,vG);
        //打印结果
        System.out.println("顶点");
        for(int i=0;i<graph.getV().length;i++)
        {
            System.out.print(graph.getV()[i]);
            System.out.print(" ");
        }
        System.out.println();
        System.out.println("邻接矩阵");
        for(int i=0;i<graph.getvG().length;i++)
        {
            for(int j=0;j<graph.getV().length;j++)
            {
                System.out.print(graph.getvG()[i][j]);
                System.out.print(" ");
            }
            System.out.println();
        }
        //BFS访问实现
        //1.定义访问标记列表
        boolean [] flagArr=new boolean[v.length];
        for(int i=0;i<v.length;i++)
        {
            flagArr[i]=false;
        }
        //2.定义辅助队列
        Queue<Integer> queue=new ArrayDeque<>();
        //A顶点入队
        queue.offer(0);
        flagArr[0]=true;
        System.out.print("BFS广度优先访问顶点:");
        System.out.print(v[0]);
        System.out.print(" ");
        //当队列不为空,逐层访问
        while (!queue.isEmpty())
        {
            //对头出队
            int vHead= queue.poll();
            //访问队头所在的邻接矩阵
            for(int i=0;i<v.length;i++)
            {
                if(graph.getvG()[vHead][i]==1&&flagArr[i]==false)
                {
                    //访问
                    System.out.print("访问 ");
                    System.out.print(v[i]);
                    System.out.print(" ");
                    flagArr[i]=false;
                    //被访问的点入队
                    queue.offer(i);
                }
            }
        }
    }

    public static void main(String[] args) {
        bfsCreate();
    }
}

结果样例

相关文章:

  • 【Python】mysql数据库增删查改
  • 数据库(MySQL)二
  • 番外·卓伊凡参加 [2025年2月HDD·鸿蒙赋能交流会·成都站] 线下活动的心得体会-优雅草卓伊凡
  • 【linux】文件与目录命令 - awk
  • 【Spark+Hadoop】基于Spark大数据小说数据分析推荐系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
  • 前缀和刷题-- LeetCode
  • 第四章:文本分类
  • 从零开始玩转TensorFlow:小明的机器学习故事 5
  • 欧拉筛法寻找素数与计算欧拉函数求和
  • 【Gin-Web】Bluebell社区项目梳理6:限流策略-漏桶与令牌桶
  • 服务器能否拒绝非浏览器发起的HTTP请求?
  • css文本两端对齐
  • 微信小程序 - 条件渲染(wx:if、hidden)与列表渲染(wx:for)
  • LeetCode-34. 在排序数组中查找元素的第一个和最后一个位置
  • 本地开发用ASP.NET Core Web API项目创建及测试
  • AF3 中扩散模型类总结
  • 使用C++实现简单的TCP服务器和客户端
  • 山东大学软件学院nosql实验四
  • docker离线安装及部署各类中间件(x86系统架构)
  • 【Microsoft PowerPoint for Mac】2分钟配置-MAC一键删除PPT中的所有备注
  • 电子商务网站建设的方法/外贸推广如何做
  • 免费发布项目的网站/郑州网站推广哪家专业
  • 微信优惠群怎么做网站/seo文章生成器
  • 凡科做的网站可以在百度搜到吗/网络推广app是违法的吗
  • 建设网站实训报告书/怎么做百度推广运营
  • 云南公司建网站多少钱/简述网站建设流程