news 2026/5/10 22:51:55

图论_图的DFS和BFS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图论_图的DFS和BFS

图的dfs和bfs与树的dfs和bfs思想相同,dfs用递归实现,bfs用队列实现,但为了避免图中的重复遍历,需要引入visited数组来标志顶点是否访问过

visited中每个顶点的下标与顶点在V集数组中的下标相同,每次遍历之前都要初始化为false

初始化visited:

void initVisited(bool visited[]){ memset(visited,0,sizeof(visited)); }

邻接矩阵和邻接表的遍历思路都基本相同,只是找邻接点的方式不一样

DFS

每次访问顶点后把visited数组中顶点对应的单元更改为ture,然后递归地遍历该节点地所有未访问过(在visited中标志为false)的邻接点

假设是连通图强连通图

  • 邻接矩阵:找v的邻接点时遍历v在矩阵中的所有出度,即遍历第v行

    void dfs(MGraph* graph,int v){ //传入一个起点 visit(v); //访问行为 visited[v]=true; for(int i=0;i<graph->vertexNum;i++){ //找未访问过邻接点 if(graph->V[v][i]!=0&&graph->V[v][i]!=INFI&&visited[i]==false){ dfs(graph,i); } } }
  • 邻接表:找v的邻接点时直接遍历节点v的出度链表

    void dfs(LGraph* graph,int v){ visit(v); //访问行为 visited[v]=ture; Edge* p=graph->V[v].firstEdge; while(p){ //找未访问过的邻接点 if(visited[p->id]==false){ dfs(graph,p->id); } p=p->next; } }

BFS

每次访问队首顶点后把visited数组中顶点对应的单元更改为ture,然后出队,并把v节点的所有未访问过邻接点入队,重复下一次循环

假设是连通图强连通图

  • 邻接矩阵

    void bfs(MGraph* graph,int x){ //从x开始 queue<int> q; //队列 q.push(x); //先把起点入队 while(!q.empty()){ int v=q.front(); q.pop(); visit(v); //访问行为 visited[v]=true; for(int i=0;i<graph->vertexNum;i++){ //找未访问过邻接点 if(graph->V[v][i]!=0&&graph->V[v][i]!=INFI&&visited[i]==false){ q.push(i); } } } }
  • 邻接表

    void bfs(LGraph* graph,int x){ //从x开始 queue<int> q; //队列 q.push(x); //先把起点入队 while(!q.empty()){ int v=q.front(); q.pop(); visit(v); //访问行为 visited[v]=true; Edge* p=graph->V[v].firstEdge; while(p){ //找未访问过的邻接点 if(visited[p->id]==false){ q.push(p->id); } p=p->next; } } }

非连通图或非强连通图的遍历

需要在遍历外面套一层循环,对图中每个visited不为ture的节点遍历

void traversal(MGraph* graph){ //邻接表同理 for(int i=0;i<graph->vectorNum;i++){ if(visited[i]==false){ dfs(graph,i); //bfs同理 } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 8:13:14

12、Windows Server 2016安全与身份验证全面指南

Windows Server 2016安全与身份验证全面指南 在当今数字化时代,服务器的安全与身份验证至关重要。Windows Server 2016提供了一系列强大的安全功能,可帮助企业保护其数据和系统免受各种威胁。本文将详细介绍Windows Server 2016中的一些关键安全特性及其配置方法。 1. 代码…

作者头像 李华
网站建设 2026/5/9 10:53:43

如何快速上手FDS:解决5大常见火灾分析难题

如何快速上手FDS&#xff1a;解决5大常见火灾分析难题 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds FDS火灾模拟软件是消防工程领域的专业工具&#xff0c;能够帮助工程师精确预测火灾发展过程和烟雾扩散路径。面对复…

作者头像 李华
网站建设 2026/5/9 10:17:13

Notepad--多行编辑7大实战技巧:从入门到精通的完整指南

Notepad--多行编辑7大实战技巧&#xff1a;从入门到精通的完整指南 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器&#xff0c;目标是做中国人自己的编辑器&#xff0c;来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 还在…

作者头像 李华
网站建设 2026/5/9 10:16:02

RISC-V指令集陷阱处理机制全面讲解

RISC-V陷阱处理机制&#xff1a;从硬件中断到系统调用的底层逻辑你有没有想过&#xff0c;当你在嵌入式设备上调用printf()的时候&#xff0c;CPU 是如何“感知”这个请求&#xff0c;并安全地把控制权交给操作系统的&#xff1f;又或者&#xff0c;当一个定时器到达设定时间&a…

作者头像 李华
网站建设 2026/5/9 15:28:34

树莓派4 HDMI输出无显示问题排查指南

树莓派4 HDMI无显示&#xff1f;别慌&#xff0c;一步步带你查到底你有没有过这样的经历&#xff1a;满怀期待地插上树莓派4&#xff0c;接好电源和显示器&#xff0c;结果屏幕一片漆黑&#xff0c;“无信号”三个字冷冷地挂在角落&#xff1f;红灯亮了&#xff0c;绿灯也在闪&…

作者头像 李华
网站建设 2026/5/9 3:11:06

GPT-SoVITS + GPU加速:语音合成性能翻倍方案

GPT-SoVITS GPU加速&#xff1a;语音合成性能翻倍方案 在短视频创作、虚拟主播和个性化教育内容爆发的今天&#xff0c;一个现实问题摆在开发者面前&#xff1a;如何用最少的数据、最快的速度生成高度拟真的定制化语音&#xff1f;传统语音合成系统往往需要几十小时录音和数天…

作者头像 李华