第六章 图 四、图的广度优先遍历(BFS算法、广度优先生成树、广度优先生成森林)

news2024/10/8 14:14:02

一、实现步骤

广度优先遍历的实现步骤如下:

1.从图的某一个节点开始,将该节点标记为已经访问过的节点。

2.将该节点加入到队列中。

3.当队列非空时,执行以下操作:

a. 取出队列队首节点,并遍历该节点与之相邻的所有未被访问过的节点,并将这些节点标记为已经访问过的节点。

b. 将遍历到的所有未被访问过的节点加入到队列中。

4.重复步骤 3,直到队列为空为止。

在实现广度优先遍历时,需要使用一个数组来保存节点的访问状态,使用一个队列来保存需要遍历的节点。同时,也可以使用一个映射表来保存节点之间的关系,从而方便查找节点和它们之间的关系。

二、代码

#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100

// 邻接表的定义
typedef struct _edge_node {
    int adjvex; // 邻接点编号
    struct _edge_node *next; // 下一个邻接点
} EdgeNode;

typedef struct _vertex_node {
    int data; // 节点数据
    EdgeNode *first_edge; // 第一个邻接点
} VertexNode;

VertexNode graph[MAX_VERTEX_NUM]; // 邻接表
int visited[MAX_VERTEX_NUM]; // 访问标记数组
int queue[MAX_VERTEX_NUM]; // 队列
int front = 0, rear = 0; // 队列指针

// 初始化邻接表
void init_graph(int n) {
    for (int i = 0; i < n; i++) {
        graph[i].data = i;
        graph[i].first_edge = NULL;
    }
}

// 添加边
void add_edge(int v1, int v2) {
    EdgeNode *e = (EdgeNode*)malloc(sizeof(EdgeNode));
    e->adjvex = v2;
    e->next = graph[v1].first_edge;
    graph[v1].first_edge = e;
}

// 广度优先遍历
void bfs(int v, int n) {
    visited[v] = 1;
    queue[rear++] = v;
    while (front != rear) {
        int u = queue[front++];
        printf("%d ", u);
        EdgeNode *e = graph[u].first_edge;
        while (e) {
            if (!visited[e->adjvex]) {
                visited[e->adjvex] = 1;
                queue[rear++] = e->adjvex;
            }
            e = e->next;
        }
    }
}

int main() {
    int n, m;
    printf("请输入图的顶点数和边数:\n");
    scanf("%d%d", &n, &m);
    init_graph(n);
    printf("请输入边的信息:\n");
    for (int i = 0; i < m; i++) {
        int v1, v2;
        scanf("%d%d", &v1, &v2);
        add_edge(v1, v2);
        add_edge(v2, v1);
    }
    printf("请输入遍历的起始点:\n");
    int v;
    scanf("%d", &v);
    printf("广度优先遍历结果为:");
    bfs(v, n);
    printf("\n");
    return 0;
}

空间复杂度:最坏情况,辅助队列的大小为V,O(V);

时间复杂度:若采用邻接矩阵存储O(V^2);若采用邻接表存储O(V+E);

三、手算遍历序列

假设有如下无向图:

我们可以从它的任意结点开始遍历

1、假如我们从结点7开始遍历

2、首先访问7,此时,遍历序列为7

3、访问7的邻接结点为3,4,6,8;此时,遍历序列为7,3,4,6,8

4、访问3的邻接结点,发现都被访问过了,跳过。

5、访问4的邻接结点,发现都被访问过了,跳过。

6、访问6的邻接结点2;此时,遍历序列为7,3,4,6,8,2

7、访问8的邻接结点,发现都被访问过了,跳过。

8、访问2的邻接结点1;此时,遍历序列为7,3,4,6,8,2,1

9、访问1的邻接结点5;此时,遍历序列为7,3,4,6,8,2,1,5

10、没有邻接结点了,遍历辅助队列,查看是否还有为遍历结点,发现还有结点9,10,11

11、重新调用BFS算法,从结点9开始遍历

依此类推,最终得到遍历序列7,3,4,6,8,2,1,5,9,10,11。

结论:对于无向图,调用BFS函数的次数=连通分量数

四、广度优先生成树,广度优先生成森林

一、无向图

书接上回:我们才遍历了一个图,所谓优先生成树,也就是每个结点最先被访问的路径,它们组成起来画出的图。

1、我们首先访问的是结点7,目前没有路径就先不动

2、通过结点7,我们访问了结点3,4,6,8;它们是第一次被访问,我们画出路径;

3、然后由结点6,访问了结点2

4、依此类推,得到最后的图

注意:我这个生成树只是其中的一种,根据存储结构的不同,所得到的树也不同。

邻接矩阵:生成树唯一。

邻接表:生成树不唯一。

由与我们还有一个连通向量,所以再加上下图就是广度优先生成森林

二、有向图

由于有向图只能单向通行所以要多次调用BFS算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring AOP:面向切面编程在实际项目中的应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

算法之位运算

前言 位运算在我们的学习中占有很重要的地位&#xff0c;从二进制中数的存储等都需要我们进行位运算 一、位运算复习 1.位运算复习 按位与(&)&#xff1a;如果两个相应的二进制位都为1&#xff0c;则该位的结果值才为1&#xff0c;否则为0 按位或( | )&#xff1a;如果…

Spring Batch:处理大数据和批量任务的解决方案

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化

聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化 目录 聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于自组织特征映射聚类算法(SOM)的数据聚类可视化 可直接运行 注释清晰 Matlab语言 1.多特征输入&…

数据接口工程对接BI可视化大屏(四)创建工程

第4章 创建工程 4.1 新建工程 在IDEA中新建工程&#xff0c;并使用SpringInitializr来创建&#xff1a; 点击下一步&#xff0c;输入项目的GAV坐标及工程构造方式后点击下一步&#xff1a; 点击下一步&#xff0c;选择主版本和模块&#xff0c;这里以Spring2.x版本为例&#…

Spring Reactive:响应式编程与WebFlux的深度探索

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

CLEAN-SC波束形成声源识别改进

CLEAN-SC 波束形成声源识别方法计算速度快、成像干净清晰、结果准确度高&#xff0c;但当传统延迟求和算法在各声源处输出的主瓣严重融合时&#xff0c;亦无法准确分辨声源。造成该缺陷的原因为: 主瓣严重融合时&#xff0c;CLEAN-SC 所基于的延迟求和输出峰值所在聚焦点即为声…

一、认识GitHub项目 —— TinyWebServer

认识GitHub项目 —— TinyWebServer 一、前言 这个项目是Linux下C轻量级Web服务器。几乎是想从事C服务器开发方向的同学的必备初始项目了。属于那种&#xff0c;“烂大街”&#xff0c;但是你又不能不会的项目。 对这个项目笔者打算多分几章讲解&#xff0c;帮助刚用GitHub&a…

系统架构设计高级技能 · 通信系统架构设计理论与实践

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 通信系统架构设计理论与实践 一、通信系统网络架构1.1 局域…

音视频质检及画质评估——为QoS QoE 指标保驾护航

// 腾讯已有超过21年的音视频技术积累&#xff0c;独家具备 RT-ONE 全球网络。此外&#xff0c;构建了包括实时音视频、云直播、云点播、即时通信、媒体处理等业界最完整的 PaaS 及 aPaaS 产品家族&#xff0c;面向各大场景提供低代码解决方案&#xff0c;开发者和企业可以快…

lighttpd以及socket和WebSocket编程

综述 本文涉及到下图绿色背景部分的内容&#xff1a; 左侧位于Linux下&#xff0c;其中包括lighttpd和socket程序&#xff1b;右侧是WebSocket程序。两者通过网络交互。 本文介绍lighttpd的基本使用方式&#xff0c;并通过编程完成一个socket服务器与浏览器端的WebSocket客户…

180B参数的Falcon登顶Hugging Face,vs chatGPT 最好开源大模型使用体验

文章目录 使用地址使用体验test1:简单喜好类问题test2:知识性问题test3:开放性问题test4:中文支持test5:问题时效性test6:学术问题使用地址 https://huggingface.co/spaces/tiiuae/falcon-180b-demo 使用体验 相比Falcon-7b,Falcon-180b拥有1800亿的参数量

【数据结构】AVL树的插入和自平衡调整

AVL树是最早发明的自平衡二叉查找树。在AVL树中&#xff0c;任一节点对应的两颗子树的最大高度差为1&#xff0c;因此他被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是 O ( log ⁡ n ) O(\log{n}) O(logn)增加和删除操作后可能需要通过一次货多次旋转…

斯坦福兔子,犰狳,obj模型下载

序 这俩&#xff0c;可能是计算机图形学里比较有名的模型。 但是&#xff0c;官方网站上下载的话&#xff0c;模型是ply格式的&#xff0c;不大习惯&#xff1b;想要obj格式的。 有没有现成的obj格式的&#xff1f; 相关网页 PositionBasedDynamics/data/models at master…

动态规划之子数组系列

子数组系列 1. 环形⼦数组的最⼤和2. 乘积最大子数组3. 等差数列划分4. 最长湍流子数组5. 单词拆分6. 环绕字符串中唯⼀的子字符串 1. 环形⼦数组的最⼤和 1.题目链接&#xff1a;环形⼦数组的最⼤和 2.题目描述&#xff1a;给定一个长度为 n 的环形整数数组 nums &#xff0c…

Pytorch-基于RNN的不同语种人名生成模型

一、RNN背景介绍 循环神经网络&#xff08;Recurrent Neural Networks, RNN&#xff09; 是一种常用的神经网络结构&#xff0c;它源自于1982年由Saratha Sathasivam提出的霍普菲尔德网络。 其特有的循环概念及其最重要的结构——长短时记忆网络——使得它在处理和预测序列数据…

Linux初探 - 概念上的理解和常见指令的使用

目录 Linux背景 Linux发展史 GNU 应用场景 发行版本 从概念上认识Linux 操作系统的概念 用户的概念 路径与目录 Linux下的文件 时间戳的概念 常规权限 特殊权限 Shell的概念 常用指令 ls tree stat clear pwd echo cd touch mkdir rmdir rm cp mv …

请求与响应以及REST风格

目录 请求与响应请求参数参数传递 五种类型参数传递普通参数POJO数据类型嵌套POJO类型参数数组类型参数集合类型参数JSON数据传输参数JSON对象数据JSON对象数组 响应返回文本数据[了解]响应JSON数据 REST风格REST简介RESTful入门案例RESTful快速开发 请求与响应 请求参数 参数…

【SpringMVC】实现增删改查(附源码)

目录 引言 一、前期准备 1.1.搭建Maven环境 1.2.导入pom.xml依赖 1.3.导入配置文件 ①jdbc.properties ②generatorConfig.xml ③log4j2.xml ④spring-mybatis.xml ⑤spring-context.xml ⑥spring-mvc.xml ⑦修改web.xml文件 二、逆向生成增删改查 2.1.导入相关u…

网络原理,了解xml, json,protobuffer的特点

目录 外卖服务器场景带入 大佬们通用的规范格式 一、&#x1f466; 外卖服务器场景 外面服务器沟通有很多模式——展示商家列表等等&#xff0c;只是其中一个&#xff0c;因此需要一个统一的规划了——不同应用程序&#xff0c;里面的自定义格式是不一样的&#xff0c;这样的…