DFS和BFS总结和代码演示(详解)

1:BFS

广度优先搜索类似于树的层次遍历过程。它需要借助一个队列来实现。如图2-1-1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1、v2、v3为第二层,v4、v5为第三层,v6为第四层,再逐个遍历每一层的每个顶点

代码演示

这里的代码演示 我是将顶点的序号从 0 开始的

#include<bits/stdc++.h>
using namespace std;//一些量的定义
queue<int> q;
#define MaxSize 100
bool visited[100];//用于表示已经访问过的结点 //邻接矩阵储存表示
typedef struct GNode* PtrGraph;
typedef struct GNode{int NV;int NE;int Data[MaxSize][MaxSize];
}gnode;//创建图
void creatGraph(PtrGraph G){int i,j;cin >> G->NV >> G->NE;//邻接矩阵初始化for(int i = 0; i < G->NV; i++){for(int j = 0; j < G->NV; j++){G->Data[i][j] = 0;//两点之间没有边相连 用 0 来表示 ,如果有边用 1 来表示}}for(int k = 0; k < G->NE; k++){cin >> i >> j;G->Data[i][j] = 1;G->Data[j][i] = 1;//两点之间有边 赋值为一;}
}//BFS遍历
void BfsGraph(PtrGraph G,int a){//a = 0;//表示从0这个点开始遍历;cout << a << ' ';//将第一个点打印出来;visited[a] = 1;//表示已经访问过1 访问过也就是代表已经可以遍历了q.push(a);//将 a 入队;while(!q.empty()){int u = q.front();q.pop();for(int i = 0; i < G->NV; i++){if(visited[i] != 1 && G->Data[u][i] !=0 ){cout << i << ' ';visited[i] = 1; //表示已经访问过q.push(i);    //将 i 入队 }}}     
}// 非连通图的BFS遍历
void BFS_Noconnected(PtrGraph G){for(int i = 0; i < G->NV; i++){visited[i] = { 0 };//将图中的点初始化为0}for(int i = 0; i < G->NV; i++){ // 将图中未访问过的结点 开始访问if(visited[i] != 1){BfsGraph(G,i);}}}int main(){PtrGraph G;G = (PtrGraph)malloc(sizeof(struct GNode));creatGraph(G);BfsGraph(G,0);//表示要从0 开始遍历;
} //6 7
//0 1
//0 2
//0 4
//1 4
//2 5
//3 4         
//3 5   //正确结果 0 1 2 4 5 3 

在这里插入图片描述

2:DFS

深度优先搜索类似于树的先序遍历,具体过程如下:

准备工作:创建一个visited数组,用于记录所有被访问过的顶点。
1.从图中v0出发,访问v0。

2.找出v0的第一个未被访问的邻接点,访问该顶点。以该顶点为新顶点,重复此步骤,直至刚访问过的顶点没有未被访问的邻接点为止。

3.返回前一个访问过的仍有未被访问邻接点的顶点,继续访问该顶点的下一个未被访问领接点。

4.重复2,3步骤,直至所有顶点均被访问,搜索结束。

实例演示

#include<bits/stdc++.h>
using namespace std;//一些量的定义
queue<int> q;
#define MaxSize 100
bool visited[100];//用于表示已经访问过的结点 //邻接矩阵储存表示
typedef struct GNode* PtrGraph;
typedef struct GNode{int NV;int NE;int Data[MaxSize][MaxSize];
}gnode;//创建图
void creatGraph(PtrGraph G){int i,j;cin >> G->NV >> G->NE;//邻接矩阵初始化for(int i = 0; i < G->NV; i++){for(int j = 0; j < G->NV; j++){G->Data[i][j] = 0;//两点之间没有边相连 用 0 来表示 ,如果有边用 1 来表示}}for(int k = 0; k < G->NE; k++){cin >> i >> j;G->Data[i][j] = 1;G->Data[j][i] = 1;//两点之间有边 赋值为一;}
}//DFS遍历 需要用到 递归 因为当遍历到一定程度 因为某个结点的邻接点均被访问过了 所以需要返回上一个访问过的结点 访问其未被访问过的邻接点
//(同理 若都被访问过则再次返回)
void DFS_Graph(PtrGraph G,int a){cout << a <<' '; //每次的打印就已经代表的访问顺序;visited[a] = 1;//代表已经访问过了for( int i = 0; i < G->NV; i++){if( visited[i] != 1 && G->Data[a][i] == 1)//DFS 遍历的专利  从一个指定的顶点出发 开始的深度遍历 DFS_Graph(G,i);//从a的邻接点开始遍历}// cout << endl;
}// 非连通图的DFS遍历
void DFS_Noconnected(PtrGraph G){for(int i = 0; i < G->NV; i++){visited[i] = { 0 };//将图中的点初始化为0}for(int i = 0; i < G->NV; i++){ // 将图中未访问过的结点 开始访问if(visited[i] != 1){DFS_Graph(G,i);}}}int main(){PtrGraph G;G = (PtrGraph)malloc(sizeof(struct GNode));creatGraph(G);DFS_Graph(G,0);//表示要从0 开始遍历;
} //6 7
//0 1
//0 2
//0 4
//1 4
//2 5
//3 4         
//3 5   //遍历顺序:0 1 4 3 5 2 

在这里插入图片描述

3:补充

如果是非联通图 则直接调用代码当中的 DFS_Noconnected函数即可

4:更深入的学习

我是学了大佬的博客 在这里给大家分享出去:添加链接描述

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

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

相关文章

Kestrel的ListenAnyIP和ListenLocalhost的区别

问题在上篇文章&#xff0c;把AAStore.ProductCatalog.Api部署到docker中运行&#xff0c;输入地址访问报错如下图&#xff0c;说明外部无法访问这个url。&#xff08;当然本地开发环境测试是可以访问的&#xff09;。后来修改此处options.ListenLocalhost(8081)的代码改成opti…

[MyBatisPlus]Plus分页插件的配置和使用

Plus分页插件的配置和使用 配置类 package com.xxxx.mybatisplus.config;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.Pagin…

控制是否展示_现场展示板管理不在于看,而在于管!

点击上方"五株科技"&#xff0c;关注公众号&#xff0c;天天有精彩&#xff01;一位日本专家根据研究数据宣称&#xff0c;如果中国的中小企业有效实行车间展示板管理&#xff0c;最大能够提升生产效率30%以上。通常被管理者小视的车间展示板&#xff0c;在专家眼中却…

7-7 六度空间 (30 分)(BFS遍历详解)(DFS最后一个点过不去)

7-7 六度空间 (30 分) 一&#xff1a;题目&#xff1a; 六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最…

龙芯完成.NET移植稳步推进生态建设

不久前&#xff0c;龙芯团队完成了.Net Core 3.1在龙芯上的移植。早在1年前&#xff0c;一位网友就告知&#xff0c;希望.Net能够移植到龙芯平台&#xff0c;因为一些政务应用场景有这方面的需求。只不过了一年&#xff0c;这就问题就被龙芯团队解决了。龙芯团队之所以移植.Net…

[MyBatisPlus]乐观锁和悲观锁

乐观锁和悲观锁 场景 一件商品&#xff0c;成本价是80元&#xff0c;售价是100元。老板先是通知小李&#xff0c;说你去把商品价格增加50元。小李正在玩游戏&#xff0c;耽搁了一个小时。正好一个小时后&#xff0c;老板觉得商品价格增加到150元&#xff0c;价格太高&#xf…

moore 数据集_警报数据集(alarm dataset)_机器学习_科研数据集

警报数据集(alarm dataset)数据摘要&#xff1a;The following datasets were used in Moore and Wong (2003),Optimal Reinsertion: A new search operator for accelerated and moreaccurate Bayesian network structure learning, ICML 2003.They are stored in this form o…

7月30日 举办专注于微服务的.NET Conf Focus

2020 年 7 月 30 日, 由.NET基金会和微软 将举办一个在线和为期一天的活动&#xff0c;包括 微软 .NET 团队的演讲者以及社区的演讲者。本次在线大会 专注.NET框架构建微服务&#xff0c;演讲者分享构建和部署云原生应用程序的最佳实践、模式、提示和技巧。有关更多信息和随时了…

7-8 哈利·波特的考试 (25 分)(详解+思路分析)真香啊

一&#xff1a;题目&#xff1a; 哈利波特要考试了&#xff0c;他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha&#xff0c;将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念&#xff0c;例…

[SpringBoot2]welcomefavicon

欢迎页支持 ● 静态资源路径下 index.html ○ 可以配置静态资源路径 ○ 但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问 ● controller能处理/index 自定义 Favicon favicon.ico 放在静态资源目录下即可。

go语言io reader_go语言之IO操作(待补充)

前言在Go中,输入和输出操作都是使用原语实现的,原语将数据模拟成可读的或者可写的字节流。而Go的io包提供了io.Reader(将数据从某个资源读取到传输缓冲区被流式传输和使用)和io.Writer(从缓冲区读取数据,并写入目标资源)接口。实现了io.Reader接口的唯一方法Read(p []byte)(n i…

ABPHelper.CLI及其依赖项简单介绍

图片gif无法查看&#xff0c;请查看原文至博客园查看详情。目录目录ABPHelper.CLIScriban通过Microsoft.Extensions.FileProviders.Embedded获取嵌入资源通过静态方法获取文件内容使用Microsoft.Extensions.FileProviders.Physical获取文件内容Microsoft.CodeAnalysis.CSharpHu…

文件的创建与读取 文件的数据添加

文件的创建与读取 文件的数据添加 一&#xff1a;概要 1&#xff1a;首先要站在程序的角度上。 2&#xff1a;文件的创建 即将程序中的数据 写入到文件当中。 3&#xff1a;文件的读取 即将一个文件中的信息读取到程序当中。 二&#xff1a;步骤 1&#xff1a;创建文件…

[RabbitMQ]整合SpringBoot

整合SpringBoot 创建项目 引入依赖 <dependencies><!--RabbitMQ 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><…

mysql 固定符号分列显示_MySql中指定符号分割并分行展示

1.涉及到的函数三个&#xff1a;1.1 REPLACE(value,str1,str2)用法规则&#xff1a;使用str2替换掉value中的所有的str1;SELECT REPLACE(我来了,来,走)执行结果如下&#xff1a;1.2 LENGTH(str)用法规则&#xff1a;获取字符串的长度&#xff0c;使用 uft8(UNICODE 的一种变长字…

​设计模式之装饰模式

装饰模式 DecoratorIntro装饰模式&#xff0c;动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰模式比生成子类更为灵活装饰模式又被称为装饰器模式或装饰者模式使用场景装饰模式是为已有功能动态地添加更多功能的一种方式当系统需要新功能的时候…

C++中 Map的了解与基本用法(代码演示+自我总结+map中一对多的用法)

C中 map的了解与基本用法&#xff08;代码演示&#xff09; 一&#xff1a;map的基本认识 Map是STL的一个关联容器&#xff0c;它提供一对一&#xff08;其中第一个可以称为关键字&#xff0c;每个关键字只能在map中出现一次&#xff0c;第二个可能称为该关键字的值&#xff…

[Redis6]跳跃表(跳表)

跳跃表(跳表) 简介 有序集合在生活中比较常见&#xff0c;例如根据成绩对学生排名&#xff0c;根据得分对玩家排名等。对于有序集合的底层实现&#xff0c;可以用数组、平衡树、链表等。数组不便元素的插入、删除&#xff1b;平衡树或红黑树虽然效率高但结构复杂&#xff1b;…

mysql 5.5 免安装_mysql 5.5.56免安装版配置方法

mysql 5.5.56免安装版配置方法&#xff0c;本文通过文字代码详解&#xff0c;具体内容如下所示&#xff1a;1. 下载mysql-5.5.56-winx64网址: dev.mysql.com/downloads/mysql/2. 解压MySQL压缩包将以下载的MySQL压缩包解压到自定义目录下,我的解压目录是:"D:\Program File…

ASP.NET Core中的响应压缩

介绍响应压缩技术是目前Web开发领域中比较常用的技术&#xff0c;在带宽资源受限的情况下&#xff0c;使用压缩技术是提升带宽负载的首选方案。我们熟悉的Web服务器&#xff0c;比如IIS、Tomcat、Nginx、Apache等都可以使用压缩技术&#xff0c;常用的压缩类型包括Brotli、Gzip…