bfs与dfs

【数据结构】图的遍历:广度优先(BFS),深度优先(DFS) 算法思想,广度优先生成树,深度优先生成树,算法实现 阅读详情

写在最前的三点:

1、所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次。

2、实现bfs和dfs都需要解决的一个问题就是如何存储图。一般有两种方法:邻接矩阵和邻接表。这里为简单起

见,均采用邻接矩阵存储,说白了也就是二维数组。

3、本文章的小测试部分的测试实例是下图:

一、深度优先搜索遍历

1、从顶点v出发深度遍历图G的算法

① 访问v

② 依次从顶点v未被访问的邻接点出发深度遍历。

2、一点心得:dfs算法最大特色就在于其递归特性,使得算法代码简洁。但也由于递归使得算法难以理解,原因

在于递归使得初学者难以把握程序运行到何处了!一点建议就是先学好递归,把握函数调用是的种种。

3、算法代码:

#include<iostream>
using namespace std;

int a[11][11];
bool visited[11];

void store_graph()  //邻接矩阵存储图
{
	int i,j;

	for(i=1;i<=10;i++)
		for(j=1;j<=10;j++)
			cin>>a[i][j];
}

void dfs_graph()    //深度遍历图
{
	void dfs(int v);

	memset(visited,false,sizeof(visited));

	for(int i=1;i<=10;i++)  //遍历每个顶点是为了防止图不连通时无法访问每个顶点
		if(visited[i]==false)
			dfs(i);
}

void dfs(int v)  //深度遍历顶点
{
	int Adj(int x);

	cout<<v<<" ";  //访问顶点v
	visited[v]=true;

	int adj=Adj(v);
	while(adj!=0)
	{
		if(visited[adj]==false)   
			dfs(adj);      //递归调用是实现深度遍历的关键所在

		adj=Adj(v);
	}
}

int Adj(int x)   //求邻接点
{
	for(int i=1;i<=10;i++)
		if(a[x][i]==1 && visited[i]==false)
			return i;

	return 0;
}

int main()
{
	cout<<"初始化图:"<<endl;
	store_graph();

	cout<<"dfs遍历结果:"<<endl;
	dfs_graph();

	return 0;
}

4、小测试

二、广度优先搜索遍历

1、从顶点v出发遍历图G的算法买描述如下:

①访问v

②假设最近一层的访问顶点依次为vi1,vi2,vi3...vik,则依次访问vi1,vi2,vi3...vik的未被访问的邻接点

③重复②知道没有未被访问的邻接点为止

2、一点心得:bfs算法其实就是一种层次遍历算法。从算法描述可以看到该算法要用到队列这一数据结构。我这

里用STL中的<queue>实现。该算法由于不是递归算法,所以程序流程是清晰的。

3、算法代码:

#include<iostream>
#include<queue>    
using namespace std;

int a[11][11];
bool visited[11];

void store_graph()  
{
	for(int i=1;i<=10;i++)
		for(int j=1;j<=10;j++)
			cin>>a[i][j];
}

void bfs_graph()    
{
	void bfs(int v);

	memset(visited,false,sizeof(visited));

	for(int i=1;i<=10;i++)  
		if(visited[i]==false)
			bfs(i);
}

void bfs(int v)
{
	int Adj(int x);

	queue<int> myqueue;
	int adj,temp;

	cout<<v<<" ";
	visited[v]=true;
	myqueue.push(v);

	while(!myqueue.empty())    //队列非空表示还有顶点未遍历到
	{
		temp=myqueue.front();  //获得队列头元素
		myqueue.pop();         //头元素出对

		adj=Adj(temp);
		while(adj!=0)
		{
			if(visited[adj]==false)
			{
				cout<<adj<<" ";
				visited[adj]=true;
				myqueue.push(adj);   //进对
			}

			adj=Adj(temp);
		}
	}
}

int Adj(int x)   
{
	for(int i=1;i<=10;i++)
		if(a[x][i]==1 && visited[i]==false)
			return i;

	return 0;
}

int main()
{
	cout<<"初始化图:"<<endl;
	store_graph();

	cout<<"bfs遍历结果:"<<endl;
	bfs_graph();

	return 0;
}

4、小测试:


C++DFS与BFS实现 C++DFS与BFS实现DFSBFS   BFS使用一个queue实现,每次循环对当前点临近的点,都推进队列中,然后就能根据队列来依次访问临近的点,直到队列中没有点为止。   DFS利用一个stack,首先把start推进stack里面,然后循环每次找到当前stack top的临近的未访问的点,访问后,推进stack里面,以便下次循环进行深度搜索。   以下使用图的遍历算法来举例说明。 DFS BFS 广度优先搜索在进一步遍历图中顶点之前,先访问当前顶点的所有邻接结点。 a .首先选择一个顶点作为起始结点, 阅读详情

相关推荐

什么时候用BFS,什么时候用DFS?BFS与DFS应用场景

1 前言 最近做到一道 找迷宫中从入口到出口最短路径的一道题。 力扣-找到离入口最近的出口 显然,理论上DFS和BFS都能找到解。 但是,DFS会超时,BFS就不会。 因此,我就又研究了一下DFS和BFS的原理,整理了一下他们的应用范围,希望自己能记住,刷题的时候少走弯路。 2 原理 2.1 BFS 宽度优先搜索算法(又称广度优先搜索) 形象地说:面临一个路口时,把所有的岔路口都记下来,然后选择其中一个进入,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路 队列(queue)实现:每次从队

咕咕酱没有悲伤的博客 4573

深度优先遍历

深度优先遍历图的方法是,从图中某顶点v出发: (1)访问顶点v; (2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问; (3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。(需要为每个顶点设置一个访问标志量,便于之后的判断) 特点:“一直向下走,走不通就调头”对每一个可能的分支路径深入到不...

qiao_xi的博客 777

传感器:MQ-5燃气模块测量燃气值(底部附代码)

本篇文章介绍使用MQ-5燃气模块测量燃气值,CPU还是选择单片机,MQ-5主要使用的技术为ADC,燃气对于单片机来说是模拟信号,需要转换为数字信号,再经过相关计算公式将燃气模拟值转换成对应的燃气数值,便于人们方便查看。例如家庭使用燃气模块测量燃气值,如果燃气值超过一定的范围,可以外设一个报警装置,保证家庭的生命安全。(1)ADC(analog to digital converter)即模数转换器,它可以将模拟信号转换为数字信号。按照其转换原理主要分为逐次逼近型、双积分型、电压频率转换型三种。STM32F1

Mr_zhang1911116的博客 1万+

广度优先搜索算法(BFS)详解

参考:https://www.cnblogs.com/tianqizhi/p/9914539.html 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS(breadth-first search),属于一种盲目搜寻法,目的是系统地展开...

lemonxiaoxiao的博客 4万+

【YOLOv8改进 - 注意力机制】GAM(Global Attention Mechanism):全局注意力机制,减少信息损失并放大全局维度交互特征

为了提高各种计算机视觉任务的性能,研究了多种注意力机制。然而,现有方法忽视了保留通道和空间两个方面信息的重要性,以增强跨维度的交互。因此,我们提出了一种全局注意力机制,通过减少信息损失和放大全局交互表示来提升深度神经网络的性能。我们引入了带有多层感知器的3D排列用于通道注意力,同时结合了卷积空间注意力子模块。在CIFAR-100和ImageNet-1K上的图像分类任务评估中,表明我们的方法在ResNet和轻量级MobileNet上稳定地优于几种最新的注意力机制。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1160

SAP-ABAP:字符与数值类型转换详细指南

SAP-ABAP:字符与数值类型转换详细指南

baidu_35680696的博客 1485

广度优先搜索(BFS)基本概念

一:BFS概念 宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。 所谓广度,就是一层一层的,向下遍历,层层堵截,还是这幅图,我们如果要是广度优先遍历的话,我们的结果是V1 V2 V3 V4 V5 V6

Jjwj11的博客 2万+

【AI测试必学】DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解

DeepSeek API 使用与 OpenAI 兼容的格式,可以通过修改配置使用 OpenAI SDK。生成的 API Key 只会显示一次,请妥善保存。注册并登录账号,进入左侧导航栏的。创建 API Key。

blues_C的博客 1万+

如何通透理解:BFS和DFS优先搜索算法(23年修订版)

4、教你通透彻底理解:BFS和DFS优先搜索算法作者:July二零一一年一月一日---------------------------------本人参考:算法导论 本人声明:个人原创,转载请注明出处。ok,开始。翻遍网上,关于此类BFS和DFS算法的文章,很多。但,都说不出个所以然来。读完此文,我想,你对图的广度优先搜索和深度优先搜索定会有个通通透透,彻彻底底的认识。

结构之法 算法之道 13万+

C++-ONNX:用onnxruntime部署自己的模型【Pytorch导出.onnx】【Tensorflow导出.onnx】【C++用onnxruntime框架部署并推理】

微软联合Facebook等在2017年搞了个深度学习以及机器学习模型的格式标准–ONNX,旨在将所有模型格式统一为一致,更方便地实现模型部署。现在大多数的深度学习框架都支持ONNX模型转出并提供相应的导出接口。ONNXRuntime(Open Neural Network Exchange)是微软推出的一款针对ONNX模型格式的推理框架,用户可以非常便利的用其运行一个onnx模型。ONNXRuntime支持多种运行后端包括CPU,GPU,TensorRT,DML等。

u013250861的博客 5766

华为OD机试新系统真题【计算电动车续航里程】

华为OD机试 新系统真题【计算电动车续航里程】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【计算电动车续航里程】多语言题解。

qq_45776114的博客 788

数据结构与算法之图的广度优先遍历

在学习图的广度优先算法时,需要先学习树的广度优先遍历 (层序遍历,树是一种特殊的图) 5.6 二叉树的层序遍历^a54835 算法存在的问题 改进代码如下: 算法复杂度分析 原理同 代码实现图广度优先遍历 相类似。 广度优先生成树有广度优先遍历过程确定。由于邻接表的表示方式不唯一,因此基于邻接表的广度优先生成树不唯一。 对非连通图的广度优先遍历,可得到广度优先生成森林 思考:......

five-five 4087

TextView部分文字可以被点击的效果。TextView拼接图片,图片可以被点击

今有一需求,就是列表标题后拼接图标,点击图标跳转一个web页; 这里简单做下笔记,以供需要的人参考: //设置部分文字点击事件 ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(conte...

LXFX1108的专栏 695

广度优先算法(BFS)&深度优先算法(DFS)

广度优先算法(BFS) 使用 BFS 的两个主要方案:遍历或找出最短路径。通常,这发生在树或图中。 模板 /** * Return the length of the shortest path between root and target node. * 返回根节点到目标节点的最短距离 */ int BFS(Node root, Node target) { Queue<Node> queue; // store all nodes which are waiting to

weixin_46083166的博客 257

VTK API 详解(134):vtkOBJWriter - 写入 OBJ 模型

是 VTK 中用于将数据写入 Wavefront OBJ 文件格式的类。OBJ 格式是广泛支持的 3D 网格模型格式,支持顶点、面和基本几何信息的保存,便于模型在多种三维软件间交换。

yumeiguo的博客 140

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# BFS DFS 迷宫寻径 深度优先算法 广度优先算法

dfs 深度优先 (1) 访问一个邻接的未访问顶点,标记它,并把它放入栈中。 (2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。 (3) 如果不能执行规则1和规则2,就完成了整个搜索过程。 bfs 广度优先 1. 首先将根节点放入队列中。 2. 从队列中取出第一个节点,并检验它是否为目标。 如果找到目标,则结束搜寻并回传结果。 否则将它所有尚未检验过的直接子节点加入

彦文的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深度优先算法DFS和广度优先算法BFS

DFS概念: 深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分 支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发 现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。DFS属于盲目搜索。 DFS步骤: 深度优先遍历图算法步骤: 1. 访问顶点v; 2. 依次从v的未被访问的邻接点出发,对图

jianchibuxie0的博客 304

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

DFS、BFS 算法

DFS使用递归方式遍历节点,而BFS则利用队列实现节点的逐层访问。通过辅助数组记录已经访问的节点,避免重复访问,并最终完成整个图的遍历。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 9132

Java图的表示与遍历(深度优先算法DFS+广度优先算法BFS)

1.图的表示 图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表) 邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1…n个点。 邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失. 邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成 为了表示方便,之后的图用二维...

m0_38036210的博客 1667

【算法+城堡问题、迷宫问题】BFS(广度优先)和DFS(深度优先)

判断顶点1是否被访问,如未访问过,就见标记数组中顶点1对应的值改为true,将顶点1入队,再判断顶点2是否被访问,重复上述操作,将2入队。再通过矩阵找到顶点1的邻接顶点0、3,顶点0的访问标记数组为true,说明被访问则不再重复访问,继续判断3是否被访问过,未访问就将标记数组的值改为true,将3入队,队列不为空则将队头元素2出队。首先访问节点0,将数组0对应的位置改为true,表示已经访问过,再将顶点0进行入队操作,再判断队列是否为空(当前有顶点0不为空),将队列的对头元素0进行出队。

2302_82116250的博客 2267

BFS和DFS(深度优先算法和广度优先算法)

文章目录直观理解BFS和DFS1.树和图2.直观理解BFS和DFS 直观理解BFS和DFS 1.树和图 图就是许多的点和许多的边把这些点连了起来,具体每个点放在那里没啥关系,重点是他们之间的连接关系,至于树:树是特殊图 可以通过节点和边的树木来区分 树:两两节点之间最多有一条边,有N个点,N-1条边,而且这N个点是互相连通。其他情况就是图了 图: 树: 2.直观理解BFS和DFS BFS和D...

weixin_41848793的博客 1346

C++ DFS 与 BFS

DFS/BFS

L_S_R_的博客 622

图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

优质文档值得推荐 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

天天向上 883

数据结构与算法(python):广度优先搜索(Breadth First Search,BFS)和深度优先算法(Depth First Search,DFS)

参考自 MOOC数据结构与算法Python版 目录一、广度优先搜索1.1 BFS算法过程1.2 广度优先搜索算法分析二、深度优先搜索2.1 骑士周游2.1.1 问题定义2.1.2 构建骑士周游图2.1.3 构建走棋关系图2.1.4 骑士周游问题算法实现2.1.5 骑士周游问题算法分析与改进2.2 通用的深度优先搜索2.3 通用的深度优先搜索算法分析 一、广度优先搜索 在单词关系图建立完成以后, 需要继续在图中寻找词梯问题的最短序列,即要用到“广度优先搜索Breadth First Search”算法对单词关

番茄大人的博客 870

DFS与BFS

无论是DFS还是BFS他们的时间复杂度空间复杂度都是O(n),对于这两种方法,我们都是在遍历树的基础上实现的。DFS运用的递归原型也可以理解为树型遍历,BFS使用队列的方式实现效率更高且更直观。

2401_86449430的博客 1477

基于Java的深度优先遍历(DFS)和广度优先遍历(BFS)

什么是深度/广度优先遍历(DFS/BFS)? 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search),它们是遍历图当中所有顶点的两种方式。

Robin的博客 3477
上一篇: 树表查找之二叉排序树
下一篇: HDU1035 四方向dfs
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值