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

【入门级-算法-7、搜索算法:广度优先搜索】

一、概念
广度优先搜索(Breadth-First Search,BFS)核心思想是 “逐层遍历、先宽后深”—— 从起点出发,先访问距离为 1 的所有节点,再访问距离为 2 的所有节点,以此类推。BFS 天然适合求解最短路径、最少步数、连通块计数等问题,且能保证找到最优解。

二、核心思想
从起点出发,先访问所有直接邻居(第一层),再访问邻居的邻居(第二层),像水波一样向外扩散,直到找到目标或遍历完所有节点。
举例说明如下:
A
/
B C
/ \ /
D E F
以上是一个树形结构,广度优先搜索访问顺序:A → B → C → D → E → F

三、BFS 核心原理

  1. 核心要素
    队列(Queue):BFS 的核心数据结构,用于存储待访问的节点,遵循 “先进先出(FIFO)” 原则,保证逐层遍历;
    访问标记(visited):避免重复访问节点,重复计算终止
    状态表示:每个节点需记录关键信息(如坐标、步数、状态值等)。
  2. 基本流程
    初始化:将起点加入队列,标记为已访问;
    循环处理队列:
    取出队首节点,处理该节点(如判断是否为终点、统计信息);
    遍历该节点的所有 “邻接节点”(合法、未访问的节点);
    将邻接节点加入队列,标记为已访问;
    终止条件:
    找到目标 → 结束并返回路径
    队列为空 → 无目标 / 遍历完成
  3. 典型应用场景
    最短路径(迷宫、网格、地图导航)
    树的层序遍历(按行打印二叉树)
    连通性检测(判断图是否连通、找连通分量)

四、C语言实现

#include<stdio.h>#include<stdlib.h>// 定义最大顶点数#defineMAX_VERTEX100// 邻接表节点结构typedefstructNode{intvertex;structNode*next;}Node;// 邻接表头结构typedefstructGraph{Node*adj[MAX_VERTEX];intvisited[MAX_VERTEX];intvertexNum;}Graph;// 队列结构(核心)typedefstructQueue{intdata[MAX_VERTEX];intfront;intrear;}Queue;// 创建新节点Node*createNode(intv){Node*newNode=(Node*)malloc(sizeof(Node));newNode->vertex=v;newNode->next=NULL;returnnewNode;}// 创建图Graph*createGraph(intvNum){Graph*graph=(Graph*)malloc(sizeof(Graph));graph->vertexNum=vNum;for(inti=0;i<vNum;i++){graph->adj[i]=NULL;graph->visited[i]=0;}returngraph;}// 添加边(无向图)voidaddEdge(Graph*graph,intsrc,intdest){// src -> destNode*newNode=createNode(dest);newNode->next=graph->adj[src];graph->adj[src]=newNode;// dest -> srcnewNode=createNode(src);newNode->next=graph->adj[dest];graph->adj[dest]=newNode;}// 初始化队列Queue*createQueue(){Queue*q=(Queue*)malloc(sizeof(Queue));q->front=-1;q->rear=-1;returnq;}// 入队voidenqueue(Queue*q,intval){if(q->rear==MAX_VERTEX-1)return;if(q->front==-1)q->front=0;q->data[++q->rear]=val;}// 出队intdequeue(Queue*q){if(q->front>q->rear||q->front==-1)return-1;returnq->data[q->front++];}// 判断队列是否为空intisEmpty(Queue*q){returnq->front==-1||q->front>q->rear;}// 广度优先搜索 BFSvoidbfs(Graph*graph,intstart){Queue*q=createQueue();// 起点入队并标记访问graph->visited[start]=1;enqueue(q,start);printf("BFS 遍历顺序:");while(!isEmpty(q)){// 出队intcurr=dequeue(q);printf("%d ",curr);// 遍历邻接节点Node*temp=graph->adj[curr];while(temp!=NULL){intv=temp->vertex;if(graph->visited[v]==0){graph->visited[v]=1;enqueue(q,v);}temp=temp->next;}}printf("\n");}// 主函数测试intmain(){// 示例图:5 个顶点intvertexNum=5;Graph*graph=createGraph(vertexNum);// 构建边addEdge(graph,0,1);addEdge(graph,0,2);addEdge(graph,1,3);addEdge(graph,1,4);addEdge(graph,2,4);// 从 0 开始 BFSbfs(graph,0);return0;}
http://www.jsqmd.com/news/611133/

相关文章:

  • 2026年,教培机构不可错过的在线教学平台大盘点
  • S7 adapter Docker run
  • 2026年口碑好的成都信息化测试/信息化实力公司推荐 - 行业平台推荐
  • 深入解析dify中的TF-IDF与余弦相似度在RAG重排序中的应用
  • RVC在元宇宙中的应用:虚拟人实时语音驱动、跨平台声纹同步
  • MiniCPM-V-2_6法律文书理解:合同条款识别+风险点标注效果展示
  • 从源码视角看OnlyOffice Connector:企业版与社区版功能差异深度解析与二次开发选型建议
  • 海外游戏SEO实战:巴西/印度市场引流经验与项目合作
  • [架构解析] 电商矩阵的“防盗门”:用独立定制 RPA 与底层群控实现员工隔离与核心 SOP 保密
  • Python爬虫终极提速:异步IO(asyncio+aiohttp)优化,比多线程还快4倍
  • 【开源】从设计文档到可交付技术交底书:专利.Skill
  • 前端设计融合:忍者像素绘卷:天界画坊生成UI/UX素材实战
  • 企业内推码寻求,助力获取奖励金,助力大家求职,实现双赢
  • 单模型时代结束了,多模型切换才是未来工作流
  • 煤化工行业实时空间孪生系统解决方案
  • Phi-4-mini-reasoning辅助JDK版本升级评估:兼容性风险智能识别
  • Filter下固定块半导体设备PP精密加工案例 | 莱图加工程师实录
  • Llama-3.2V-11B-cot惊艳效果:手写公式图→识别→数学推导→结论验证全链路
  • Ollama小白入门:从零开始使用Yi-Coder-1.5B,体验AI写代码
  • all-MiniLM-L6-v2部署详解:GPU算力友好型轻量模型在Ollama中的优化实践
  • Windows Defender 移除工具深度解析:架构设计与企业级部署指南
  • DotNetPy:现代.NET 与 Python 互操作 实战指南临
  • 免费数字人形象哪里找?lite-avatar形象库150+资源实测
  • Z-Image-Turbo-辉夜巫女高性能部署:Xinference量化加载+Gradio并发优化实测
  • 科研助手实战:OpenClaw+Phi-3-vision自动整理文献图表数据
  • **为生命按下“刷新键”:当细胞科技成为健康管理的新日常**
  • 深度学习项目训练环境快速上手指南:5分钟激活dl环境、解压数据、启动训练
  • 原子操作的内存顺序
  • 解码AMD EPYC CPU命名规则:从数字到性能的全面解析
  • [5个高效方案]的开源项目X批量授权激活完全指南