news 2026/6/10 20:38:24

图论_图的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/6/10 19:27:26

ZLUDA:让AMD显卡也能流畅运行CUDA应用的终极解决方案

ZLUDA&#xff1a;让AMD显卡也能流畅运行CUDA应用的终极解决方案 【免费下载链接】ZLUDA CUDA on AMD GPUs 项目地址: https://gitcode.com/gh_mirrors/zlu/ZLUDA 项目亮点速览 ZLUDA 是一个革命性的开源项目&#xff0c;它打破了长期以来NVIDIA在CUDA生态中的垄断地位…

作者头像 李华
网站建设 2026/6/10 1:58:32

GPT-SoVITS训练数据预处理技巧:降噪、分割与对齐方法论

GPT-SoVITS训练数据预处理技巧&#xff1a;降噪、分割与对齐方法论 在语音合成技术飞速发展的今天&#xff0c;个性化音色克隆已不再是科研实验室的专属。随着开源项目如 GPT-SoVITS 的出现&#xff0c;普通用户仅凭一分钟清晰录音就能生成高度拟真的定制化语音。然而&#xf…

作者头像 李华
网站建设 2026/6/10 15:55:03

基于电感的EMI滤波设计方法:操作指南

电感如何“驯服”电磁干扰&#xff1f;一份实战派的EMI滤波设计手记你有没有遇到过这样的场景&#xff1a;电路功能一切正常&#xff0c;可一上电测EMC&#xff0c;传导发射就超标几dB&#xff1b;改了layout、加了屏蔽&#xff0c;噪声还是从电源线“爬”出来&#xff1f;最后…

作者头像 李华
网站建设 2026/6/10 19:29:41

5分钟告别字体选择困难症!得意黑Smiley Sans全平台高效安装实战

5分钟告别字体选择困难症&#xff01;得意黑Smiley Sans全平台高效安装实战 【免费下载链接】smiley-sans 得意黑 Smiley Sans&#xff1a;一款在人文观感和几何特征中寻找平衡的中文黑体 项目地址: https://gitcode.com/gh_mirrors/smi/smiley-sans 还在为设计作品找不…

作者头像 李华
网站建设 2026/6/10 15:38:49

notepad--终极指南:快速掌握跨平台文本编辑神器

notepad--终极指南&#xff1a;快速掌握跨平台文本编辑神器 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器&#xff0c;目标是做中国人自己的编辑器&#xff0c;来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 还在为不同…

作者头像 李华