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

news/2024/5/2 20:15:51/文章来源:https://blog.csdn.net/icbbm/article/details/132783586

一、实现步骤

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

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.luyixian.cn/news_show_169386.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下载Ubantu镜像文件、创建虚拟机以及ubantu安装详细教程

目录 前言 Ubantu是什么&#xff1f;它有什么作用&#xff1f; 一、Ubantu镜像文件下载步骤 1.第一步安装VMware Workstation 2.第二步下载Ubuntu的镜像文件 镜像文件下载官网网址入下&#xff1a; 二、创建虚拟机和安装Ubantu的步骤 1.打开VMware Workstation并点击创…

【C语言基础】那些你可能不知道的C语言“潜规则”

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

mysql 增量备份与恢复使用详解

目录 一、前言 二、数据备份策略 2.1 全备 2.2 增量备份 2.3 差异备份 三、mysql 增量备份概述 3.1 增量备份实现原理 3.1.1 基于日志的增量备份 3.1.2 基于时间戳的增量备份 3.2 增量备份常用实现方式 3.2.1 基于mysqldump增量备份 3.2.2 基于第三方备份工具进行增…

堆相关例子-排序最多移动k距离

题目&#xff1a; 一个几乎有序的数组。几乎有序是指&#xff1a;如果把数组排好序&#xff0c;每个数的移动距离一定不超过K&#xff0c;并且K一定远小于数组长度 分析&#xff1a; 给定的数组有上面的限制条件&#xff0c;根据条件可以分析得到&#xff1a; 对于前0-k个数…

javaee springMVC model的使用

项目结构图 pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…

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

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

振弦采集仪应用地铁隧道安全监测详细解决方案

振弦采集仪应用地铁隧道安全监测详细解决方案 随着城市化进程的不断加快&#xff0c;地铁作为一种高效、便捷、环保的交通方式已经成为现代城市不可或缺的一部分。因此&#xff0c;对地铁的安全性也越来越重视&#xff0c;一般二三线以上的城市在不断发展中&#xff0c;地铁做…

数据库相关基础知识

第一章 概念 1、数据&#xff1a;描述事物的符号记录称为数据。特点&#xff1a;数据和关于数据的解释不可分。 2、数据库&#xff1a;长期存储在计算机内、有组织、可共享的大量的数据的集合。数据库中的数据按照一定的数据模型组织、描述和存储&#xff0c;具有较小的冗余度、…

9月8日扒面经

慢sql日志的排查和调优 开启慢查询日志&#xff1a;首先需要确保数据库的慢查询日志功能已经开启。在MySQL中&#xff0c;可以通过设置slow_query_log参数为1来开启慢查询日志&#xff0c;并设置long_query_time参数来定义慢查询的阈值。定位慢查询语句&#xff1a;根据慢查询…

SpringBootWeb请求-响应

HTTP请求 前后端分离 在这种模式下&#xff0c;前端技术人员基于"接口文档"&#xff0c;开发前端程序&#xff1b;后端技术人员也基于"接口文档"&#xff0c;开发后端程序。 由于前后端分离&#xff0c;对我们后端技术人员来讲&#xff0c;在开发过程中&a…

TDesign的input标签

目录 一、 新建页面01-todolist 二、 t-input标签、t-button标签 2.1 t-input标签 2.1.1 01-todolist.wxml页面 2.2 01-todolist.json页面 2.3 01-todolist.js页面 2.4 01-todolist.wxss页面 2.2 t-button标签 示例1&#xff1a;bind:change 示例2&#xff1a;bind:…

完成Centos上使用SSH公钥进行免密上传文件到gitee的步骤后,测试免密推送到gitee的时候还是需要输入邮箱和密码

如果你已经按照正确的步骤设置了SSH公钥并进行了免密测试&#xff0c;但仍然需要输入邮箱地址和密码才能推送到gitee&#xff0c;那么可能有以下几种原因&#xff1a; 您可能没有使用SSH URL来推送代码。请确保您使用的是SSH URL而不是HTTPS URL来推送代码。您可以使用命令 gi…

go语言基础操作---七

socket简单介绍—套接字编程 什么是Socket Socket&#xff0c;英文含义是【插座、插孔】&#xff0c;一般称之为套接字&#xff0c;用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix&#xff0c;而Unix基本哲学之一就是“一切皆文件”&#xff0c;都可…

使用JS实现一个简单的观察者模式(Observer)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 手撸Observer⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领…

API 架构学习

MQTT架构 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的“轻量级”通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在…

Redis3.2.1如何设置远程连接?允许局域网访问

背景&#xff1a; 电脑A的redis需要开放给电脑B使用&#xff0c;二者处于同一局域网 【后面会补充更详细的踩坑历程&#xff0c;先发出来作为记录】 过程&#xff1a; 在你查了很多方法后&#xff0c;如果还是没有解决&#xff0c; 尝试考虑一下你的redis配置文件是不是修…

系列三、Linux中安装Nginx

一、准备工作 1.1、确保gcc安装成功 如果没有安装gcc执行./configure将会报错。 # 使用如下指令安装gcc&#xff1a;两个都要安装 yum -y install gcc yum -y install gcc-c 1.2、下载nginx1.12.2 http://nginx.org/en/download.html 1.3、下载pcre-8.3.7.tar.gz 1.3.…

2023/9/8 -- C++/QT

作业 1> 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量 成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 02stack.h: #ifndef __02STACK_H__ #define __…

3D点云测量:计算三个平面的交点

文章目录 0. 测试效果1. 基本内容文章目录:3D视觉测量目录0. 测试效果 1. 基本内容 计算三个平面的交点需要找到满足所有三个平面方程的点。三个平面通常由它们的法向量和通过它们的点(或参数形式的方程)来定义。以下是计算三个平面的交点的一般步骤: 假设有三个平面,分别…

Spring系列文章:Spring事务

一、事务简述 1、什么是事务&#xff08; Transaction&#xff08;tx&#xff09;&#xff09; 在⼀个业务流程当中&#xff0c;通常需要多条DML&#xff08;insert delete update&#xff09;语句共同联合才能完成&#xff0c;这 多条DML语句必须同时成功&#xff0c;或者同…