c语言广度优先搜索(Breadth-First Search,BFS)

广度优先搜索(Breadth-First Search,BFS)是一种用于遍历或搜索树或图的结构的算法。这个算法从图的某一结点开始遍历,然后访问所有相邻的节点。然后对这些相邻节点,再看它们的未被访问过的相邻节点,以此类推。这种方式就是广度优先,也可以理解为先访问完一层再访问下一层。

以下是一个使用广度优先搜索访问图的C语言代码示例。为了简化问题,我们假设图中的节点表示为整数,并使用邻接矩阵来表示图。代码中有详细的注释和解释。

#include <stdio.h>
#define SIZE 40struct queue {int items[SIZE];int front;int rear;
};// 创建一个新的队列
struct queue* createQueue() {struct queue* q = malloc(sizeof(struct queue));q->front = -1;q->rear = -1;return q;
}// 向队列中添加元素
void enqueue(struct queue* q, int value) {if (q->rear == SIZE - 1)printf("\nQueue is Full!!");else {if (q->front == -1)q->front = 0;q->rear++;q->items[q->rear] = value;}
}// 从队列中移除元素
int dequeue(struct queue* q) {int item;if (q->front == -1) {printf("Queue is empty");item = -1;} else {item = q->items[q->front];q->front++;if (q->front > q->rear) {q->front = q->rear = -1;}}return item;
}// 检查队列是否为空
int isEmpty(struct queue* q) {if (q->rear == -1) return 1;else return 0;
}// 创建一个图
struct Graph {int numVertices;int** adjMatrix;
};// 创建一个新的图
struct Graph* createGraph(int vertices) {struct Graph* graph = malloc(sizeof(struct Graph));graph->numVertices = vertices;graph->adjMatrix = malloc(vertices * sizeof(int*));for (int i = 0; i < vertices; i++) {graph->adjMatrix[i] = malloc(vertices * sizeof(int));}// 初始化邻接矩阵for (int i = 0; i < vertices; i++) {for (int j = 0; j < vertices; j++)graph->adjMatrix[i][j] = 0;}return graph;
}// 添加边
void addEdge(struct Graph* graph, int src, int dest) {graph->adjMatrix[src][dest] = 1;graph->adjMatrix[dest][src] = 1;
}// 执行广度优先搜索
void bfs(struct Graph* graph, int startVertex) {struct queue* q = createQueue();int visited[graph->numVertices];for (int i = 0; i < graph->numVertices; i++)visited[i] = 0;visited[startVertex] = 1;enqueue(q, startVertex);while (!isEmpty(q)) {printQueue(q);int currentVertex = dequeue(q);printf("Visited %d\n", currentVertex);// 遍历当前节点的所有邻居for (int i = 0; i < graph->numVertices; i++) {if (graph->adjMatrix[currentVertex][i] == 1 && !visited[i]) {enqueue(q, i);visited[i] = 1;}}}
}// 主函数
int main() {struct Graph* graph = createGraph(6);addEdge(graph, 0, 1);addEdge(graph, 0, 2);addEdge(graph, 1, 2);addEdge(graph, 1, 4);addEdge(graph, 1, 3);addEdge(graph, 2, 4);addEdge(graph, 3, 4);bfs(graph, 0);return 0;
}

代码的主要步骤如下:

  1. 创建一个队列:在广度优先搜索中,我们使用队列来存储尚未访问过的节点。在这个示例中,我们使用一个结构体来表示队列,并实现了向队列中添加元素(enqueue)、从队列中移除元素(dequeue)以及检查队列是否为空(isEmpty)的操作。

  2. 创建一个图:我们使用一个结构体来表示图,并实现了创建新图(createGraph)和添加边(addEdge)的操作。在这个示例中,我们假设图是无向的,所以如果存在一条从节点A到节点B的边,那么就存在一条从节点B到节点A的边。

  3. 执行广度优先搜索

    • 首先,我们创建一个数组(visited)来记录哪些节点已经被访问过。然后,我们将起始节点添加到队列中,并标记为已访问。
    • 然后,我们进入一个while循环,直到队列为空为止。在每次循环中,我们都从队列中移除一个节点,并访问这个节点。
    • 对于每个被访问的节点,我们都遍历它的所有相邻节点,并检查它们是否已经被访问过。如果一个相邻节点尚未被访问过,那么就将它添加到队列中,并标记为已访问。
  4. 主函数:在主函数中,我们创建了一个新的图,并添加了一些边。然后,我们从节点0开始执行广度优先搜索。

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

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

相关文章

【python 的各种模块】(8) 在python使用matplotlib和wordcloud库来画wordcloud词云图

目录 目标&#xff1a;用python画出&#xff0c;网上流行的wordcloud词云图 1 准备工作 1.1环境准备 1.1.1安装步骤 1.2 资源准备 1.2.1 文本文件内容如下 1.2.2 图片资源 2 代码测试 2.1 第一版代码和效果 2.1.1 代码和效果 2.1.2 一般plt里解决中文乱码问题 2.1…

Java中XML的解析

1.采用第三方开元工具dom4j完成 使用步骤 1.导包dom4j的jar包 2.add as lib.... 3.创建核心对象, 读取xml得到Document对象 SAXReader sr new SAXReader(); Document doc sr.read(String path); 4.根据Document获取根元素对象 Element root doc.getRootElement(); …

点击文本框可选择赋值,不可输入填写值

【场景】用户点击输入文本框可选择时间&#xff0c;不可以直接输入时间 给input加 readonly属性&#xff0c;没有光标&#xff0c;可进行点击。 <el-inputreadonlyplaceholder"请选择"click"goSelectBandTime(index, indexss)"/>

【概念】大模型与ChatGPT/SaaS、PaaS和IaaS

大模型与ChatGPT区别 大模型与ChatGPT是人工智能领域中的两个重要概念&#xff0c;它们之间有一些联系&#xff0c;也有一些区别。大模型是指大规模的深度学习模型&#xff0c;通常包含数十亿甚至更多参数&#xff0c;需要大量的计算资源和 训练数据来进行训练。大模型的优点…

win11 or win10 安装Ubuntu 22.04.3 LTS 子系统

** 1. 修改电脑的相关设置 ** 1.在系统设置中的开发者人员模式&#xff0c;设置为开启状态 2. 在控制面板中的程序中的启用或者关闭windows功能下&#xff0c;开启&#xff08;勾选&#xff09;子系统模式&#xff0c;然后重启电脑 2. 在Microsoft store中下载子系统&…

深度学习 | DRNN、BRNN、LSTM、GRU

1、深度循环神经网络 1.1、基本思想 能捕捉数据中更复杂模式并更好地处理长期依赖关系。 深度分层模型比浅层模型更有效率。 Deep RNN比传统RNN表征能力更强。 那么该如何引入深层结构呢&#xff1f; 传统的RNN在每个时间步的迭代都可以分为三个部分&#xff1a; 1.2、三种深层…

java系列-Semaphore

信号量&#xff08;Semaphore&#xff09;不是严格意义上的锁&#xff0c;而是一种同步工具&#xff0c;用于控制同时访问某个特定资源的线程数量。信号量是由计数器和等待队列组成&#xff0c;它维护一个可用的许可证数量&#xff0c;线程可以通过获取许可证来执行临界区代码&…

算法与数据结构--特殊有序集的线性时间排序算法

一.计数排序算法 基本思想&#xff1a;统计每个输入元素的个数&#xff0c;然后根据这些计数值重构原数组。 使用范围&#xff1a;需要知道元素大小范围&#xff0c;就是最大值是多少。 【排序算法】计数排序_哔哩哔哩_bilibili 二.基数排序 使用场景&#xff1a;只适用于…

Laravel的知识点

1.{{ }} 是在 HTML 中内嵌 PHP 的 Blade 语法标识符&#xff0c;表示包含在该区块内的代码都将使用 PHP 来编译运行。 2.两种写法 3.return void 在这段注释中&#xff0c;"return void" 表示该函数或方法没有返回值。这意味着它执行某些操作或任务&#xff0c;但…

Java 面试题集锦记录

Java 面试题集锦记录 一1. SpringBoot、SpringCloud区别2. SpringCloud怎么保证服务间通信&#xff1f;3. Spring怎么保持高可用性、稳定性&#xff1f;4. 负载均衡5. [Rabbitmq](https://blog.csdn.net/qq_40985985/article/details/128013229) 怎么避免重复消费&#xff0c;[…

C#通讯——关于Winform中的简单的Http服务器与客户端

C#通讯——关于Winform中的简单的Http服务器与客户端 前言一、Http是什么&#xff1f;二、简单的Http服务器三、简单的Http客户端四、实际调用五、Winform中Http服务器和WebApi的区别&#xff1f; 前言 在实际项目中通讯的交互的过程中&#xff0c;遇见数据传输时同事和我说用…

论文阅读《Rethinking Efficient Lane Detection via Curve Modeling》

目录 Abstract 1. Introduction 2. Related Work 3. BezierLaneNet 3.1. Overview 3.2. Feature Flip Fusion 3.3. End-to-end Fit of a Bezier Curve 4. Experiments 4.1. Datasets 4.2. Evalutaion Metics 4.3. Implementation Details 4.4. Comparisons 4.5. A…

使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解

摘要 本文博客将介绍如何在iOS环境下使用克魔助手进行数据抓包和HTTP抓包。通过抓包&#xff0c;开发者可以分析移动应用程序的网络请求发送和接收过程&#xff0c;识别潜在的性能和安全问题&#xff0c;提高应用的质量和安全性。 引言 在移动应用程序的开发和测试过程中&am…

Linux磁盘与文件系统管理

目录 在linux系统中使用硬盘 磁盘的数据结构 磁盘接口类型 字母含义 MBR磁盘分区 分区类型 分区的缺点 文件系统的 文件系统有什么作用 文件系统的修复 检测并确认新磁盘 参看磁盘信息 查看磁盘信息 添加磁盘 查看添加磁盘情况&#xff1a;sda系统磁盘&#xff…

每周一算法:区间覆盖

问题描述 给定 N N N个闭区间 [ a i , b i ] [a_i,b_i] [ai​,bi​]&#xff0c;以及一个线段区间 [ s , t ] [s,t] [s,t]&#xff0c;请你选择尽量少的区间&#xff0c;将指定线段区间完全覆盖。 输出最少区间数&#xff0c;如果无法完全覆盖则输出 − 1 -1 −1。 输入格式…

【自然语言处理】第3部分:识别文本中的个人身份信息

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

凸函数的定义,保凸运算和各种性质

定义: 函数 f : R n → R f:R^n\rightarrow R f:Rn→R是凸的,如果 d o m f domf domf是凸集,且对于任意 x , y ∈ d o m f x,y\in domf x,y∈domf和任意 0 ≤ θ ≤ 1 0\le \theta \le1 0≤θ≤1都有 f ( θ x ( 1 − θ ) y ) ≥ θ f ( x ) ( 1 − θ ) f ( y ) f(\theta x…

解决Hive在DataGrip 中注释乱码问题

注释属于元数据的一部分&#xff0c;同样存储在mysql的metastore库中&#xff0c;如果metastore库的字符集不支持中文&#xff0c;就会导致中文显示乱码。 不建议修改Hive元数据库的编码&#xff0c;此处我们在metastore中找存储注释的表&#xff0c;找到表中存储注释的字段&a…

软件测试/测试开发丨Python学习笔记之基本数据类型与操作

一、变量 1、变量的定义&#xff1a; a. 在python中&#xff0c;变量是一种存储数据的载体。计算机中的变量是实际存在的数据或者说是存储器中存储数据的一块内存空间&#xff1b; b.变量的值可以被读取和修改。 2、命名规则&#xff1a; a.变量名由字母&#xff08;广义的Unic…

Python 常用模块Logging

Python 常用模块Logging 【序言】 logging模块是专门用来做日志记录的模块 【一】日志等级 默认打印结果到终端上 CRITICAL 50 # 致命错误 ERROR 40 # 错误 WARNING 30 # 警告 INFO 20 # 消息 DEBUG 10 # 调试 NOTSET 0 # 不设置示例&#xff1a; 默认级别为…