图的遍历——深度优先搜索和广度(宽度)优先搜索(含例题)

宽度优先搜索(二) 在上一篇文章中,我们了解了宽搜及其相关概念,那么这篇文章就为大家带来几个经常出现的宽搜题目(题目类型自己总结,请见谅)这便是宽搜中几个比较常考的题,如果有什么不足或错误地方欢迎指正,我会在日后根据你们的意见不断改正这篇文章。 阅读详情
AI摘要

本文深入解析了深度优先搜索(DFS)和广度优先搜索(BFS)的基本思想、步骤与代码结构,通过实例展示了两种算法的应用场景,并提供了代码示例帮助理解。

专栏导读及目录https://blog.youkuaiyun.com/createprogram/article/details/86741044

深度优先搜索

DFS基本思想

基本步骤:

1.从图中某个顶点v0出发,首先访问v0;  

2.访问结点v0的第一个邻接点,以这个邻接点vt作为一个新节点,访问vt所有邻接点。直到以vt出发的所有节点都被访问到,回溯到v0的下一个未被访问过的邻接点,以这个邻结点为新节点,重复上述步骤。直到图中所有与v0相通的所有节点都被访问到。

3.若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点。重复深度优先搜索过程,直到图中的所有节点均被访问过。

 

基本代码结构

void DFS( Point P ){
        for(所有P的邻接点K){
                if(K未被访问){
	            if(k == e)	
                      return true;
                       标记K;
                   dfs(k);
                }
        }
}

广度优先搜索

BFS基本思想

基本步骤:

1.从图中某个顶点v0出发,首先访问v0;

2.依次访问v0的各个未被访问的邻接点;

3.依次从上述邻接点出发,访问它们的各个未被访问的邻接点。

4.若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点。重复广度优先搜索过程,直到图中的所有节点均被访问过。

 

基本代码结构

通常用队列(先进先出,FIFO)实现

	初始化队列Q.
	Q={起点s}; 
       标记s为己访问;
	while (Q非空) {
		取Q队首元素u; u出队;
		if (u == 目标状态) {…}
		所有与u相邻且未被访问的点进入队列;
		标记与u相邻的点为已访问;
	}

DFS/BFS是竞赛中最常见的基础算法。虽然题目多种多样,但无外乎就是套用上文的程序片段,最主要的还是结合习题多练习达到熟能生巧。

这里呢,我想多讲一点。上面的BFS是使用C++库里封装的队列的,这里额外写一个不使用封装队列的方法,就是自己使用一个数组来模拟操作,见下方代码:

#include<bits/stdc++.h>
using namespace std;
int a[105][105],vis[105],n,m;
//a是邻接矩阵 vis是标记 点是否被访问过
void bfs(int k){ //k是当前点的名字
		int q[105];
		int f,r,i,j;//r表示当前BFS路过的点是第r个点
		q[1]=k;
		vis[k]=1;
		f=1;r=1;
		while(f<=r){
			i=q[f];
			for(j=1;j<=m;j++){
				if(a[i][j]>0&&!vis[j]){ //邻接矩阵中a[i][j]>0 表示 i和j连通
					r++;
					q[r]=j;
					vis[j]=1;
				}
		
			}
			f++;
		}
		for(i=1;i<=r;i++) cout<<q[i]<<" ";//输出当前BFS层的点的序号
}
int main(){
	int h,v1,v2;
	cin>>m;//点的数量
	cin>>n;//边的数量
	memset(a,0,sizeof(a));
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++){
		cin>>v1>>v2>>h;//每条边的  起点 终点 边长
		a[v1][v2]=a[v2][v1]=h;//无向图正反对接
	}
	for(int i=1;i<=m;i++)if(!vis[i])bfs(i);
	return 0;
}

下面给出一些例题和代码 及时练习效果更佳

 

 

 

出栈次序

 

X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。

    路边有个死胡同,只能容一辆车通过,是临时的检查站,如图【p1.png】所示。 

    X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。

    如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?

    为了方便起见,假设检查站可容纳任意数量的汽车。

    显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。

    现在足足有16辆车啊,亲!需要你计算出可能次序的数目 

这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性文字)。   

#include<iostream>
using namespace std;
long long count=0;
void dfs(int a,int b,int k){
	if(a==16&&b==16&&k==32){
		
		count++;
		return;
	}
	
	if(a<=16&&b<=16&&a>=b&&k<32){
	
		dfs(a+1,b,k+1);
		dfs(a,b+1,k+1);
	}
	return ;	
}
int main(){
	dfs(1,0,1);
	cout<<count;
	return 0;
}

油田

输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(八个方向),就说明他们属于同一个八连块。如图,有两个八连块

  *   *   *   * @

  * @ @   * @

  * @   *   * @

@ @ @   * @

@ @   *   * @

方法一:用DFS解决

#include<cstdio>
#include<cstring>
const int maxn=105;
char pic[maxn][maxn];
int m,n,idx[maxn][maxn];
void dfs(int r,int c,int id){
	if(r<0||r>=m||c<0||c>=n) return;
	if(idx[r][c]>0||pic[r][c]!='@') return;
	idx[r][c]=id;
	for(int dr=-1;dr<=1;dr++)
		for(int dc=-1;dc<=1;dc++)
			if(dr!=0||dc!=0)dfs(r+dr,c+dc,id);
}
int main(){
	while(scanf("%d%d",&m,&n)==2&&m&&n){
		for(int i=0;i<m;i++) scanf("%s",pic[i]);
		memset(idx,0,sizeof(idx));
		int cnt=0;
		for(int i=0;i<m;i++)
			for(int j=0;j<n;j++)
				if(idx[i][j]==0&&pic[i][j]=='@') dfs(i,j,++cnt);
		printf("%d\n",cnt);		
	}
	return 0;
} 

 

方法二:用BFS解决

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int m,n;
int vis[maxn][maxn];
char s[maxn][maxn];
int cnt=0;
int dir[8][2]={{0,1},{1,-1},{-1,-1},{-1,0},{0,-1},{-1,1},{1,0},{1,1}};
typedef struct Node{
    int x,y;
}node;
void bfs(int x,int y){
    node p,t;
    queue<node> q;
    p.x=x;
    p.y=y;
    q.push(p);
    while(!q.empty()){
        p=q.front();
        q.pop();
        for(int i=0;i<8;i++){
            t.x=p.x+dir[i][0];
            t.y=p.y+dir[i][1];
            if(t.x<0||t.x>=n||t.x<0||t.y>=m){
                continue;
            }
            if(!vis[t.x][t.y]&&s[t.x][t.y]=='@'){
                vis[t.x][t.y]=1;
                q.push(t);
            }
        }
    }
}
int main()
{
    while(scanf("%d %d",&n,&m)&&(n+m)){
        memset(vis,0,sizeof vis);
        cnt=0;
        for(int i=0;i<n;i++){
            scanf("%s",s[i]);
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!vis[i][j]&&s[i][j]=='@'){
                    vis[i][j]=1;
                    cnt++;
                    bfs(i,j);
                }
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}

 

深度优先搜索(dfs),宽度优先搜索(bfs),深度优先遍历,宽度优先遍历 DFS,BFS,树与图的深度优先遍历,树与图的广度优先遍历,树的重心,八数码,走迷宫,n皇后,全排列经典例题。 阅读详情

相关推荐

十大基础实用算法之深度优先搜索和广度优先搜索

深入讲解了深度优先和广度优先算法的实现,有详细的图解实例以及代码实现,清晰易懂。 使用类的思想实现代码,面向对象分析。

yapian8的专栏 5348

图(深度优先遍历&广度优先遍历)

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

sinat_31089473的博客 907

【数据结构】3个例题带你理解图的遍历:深度优先搜索

深度优先搜索遍历图的时间复杂度和广度优先遍历相同,不同之处仅在于对顶点的访问顺序不同。

四季轮换叶,一路招摇胜 5651

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

遍历深度优先遍历无向图的深度优先遍历图解有向图的深度优先遍历图解广度优先遍历无向图的广度优先遍历图解有向图的广度优先遍历图解 图的遍历,所谓遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点; 当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的

AngelDg的博客 6154

【数据结构】2个例题带你理解图的遍历:广度优先搜索

广度优先搜索遍历图的过程,实际上就是寻找队列中顶点的邻接点的过程。从图中的某个顶点v开始,先访问该顶点再依次访问该顶点的每一个未被访问过的邻接点

四季轮换叶,一路招摇胜 2927

.ipynb文件深度解析:从JSON结构到Jupyter Notebook高效使用指南

在Python开发与数据处理领域,交互式编程正成为探索数据与验证思路的高效方式。Jupyter Notebook作为最流行的交互式环境之一,其默认文件格式.ipynb本质是一个基于JSON的文本文件,内部通过单元格组织代码、说明文字与运行结果。理解其JSON结构,不仅有助于掌握Notebook的存储原理,更能为文件损坏修复、版本控制与自动化转换提供基础。依托对单元格类型、魔法命令及输出可视化的熟练运用,数据分析和数据可视化流程可以变得更为流畅。同时,借助VS Code、nbconvert等工具,开发者能将.

weixin_28839629的博客 347

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS) 安然若知 12018.07.13 08:38:53字数 753阅读 101,761 深度优先搜索和广度优先搜索,都是图形搜索算法,它两相似,又却不同,在应用上也被用到不同的地方。这里拿一起讨论,方便比较。 一、深度优先搜索 深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为DFS即Depth First Search。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应...

cxu123321的博客 2万+

安卓ai自动化脚本 Yyds.Auto实现 示例 纯ai图像识别自动点击脚本

纯ai识别实现自动化脚本

专注安卓前沿科技 4780

深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先和广度优先是在图和树的遍历搜索中比较常用的搜索方法 深度优先 算法简介 DFS是可用于遍历树或者图的搜索算法,DFS与回溯法类似,一条路径走到底后需要返回上一步,搜索第二条路径。在树的遍历中,首先一直访问到最深的节点,然后回溯到它的父节点,遍历另一条路径,直到遍历完所有节点。图也类似,如果某个节点的邻居节点都已遍历,回溯到上一个节点。 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等.

段一的博客 6万+

C#图表开发避坑指南:Chart控件的Series和Points属性详解

本文深入解析C#图表开发中Chart控件的Series和Points核心属性,提供避坑指南。详细阐述了Series的数据序列管理、Points的高效操作与空值处理,以及多Series与ChartArea的协同配置,帮助开发者避免常见错误,实现稳定、高性能的数据可视化应用。

weixin_29313239的博客 363

第28节:cesium 加载高程数据(含源码+视频)

cesium 加载高程(地形)数据

qq_29384639的博客 1740

图的遍历之深度优先搜索和广度优先搜索

深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直...

cowbin2012的专栏 1万+

在RV1126上实现人脸识别----MobileFaceNet转成rknn模型

目录 1.模型下载 2 转成rknn模型并推理 3 查看网络模型 1.模型下载 首先下载MobileFaceNet的模型,github下载地址为:https://github.com/sirius-ai/MobileFaceNet_TF/tree/master/arch/pretrained_model/ 2 转成rknn模型并推理 import numpy as np import cv2 from rknn.api import RKNN if __name__ == '__..

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3526

(图的遍历)深度优先搜索和广度优先搜索

它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。在第1步访问A之后,接下来应该访问的是A的邻接点,即"C,D,F"中的一个。

sinat_41942180的博客 1777

AE(自动曝光)调试策略:曝光曲线设计与过曝控制

自动曝光(AE, Auto Exposure)系统是图像质量控制链路中的核心模块之一,其性能直接决定了成像亮度是否稳定、细节是否完整、场景切换是否自然。在现代移动终端影像系统中,AE 不仅需要适应不同光照强度和复杂环境,还需兼顾人脸优先、HDR触发、视频帧率控制等多目标优化需求。本文基于高通 Snapdragon 和 MTK Dimensity 等主流平台的调试经验,系统梳理了 AE 模型设计原则、曝光曲线配置、测光策略选择与过曝抑制机制,并结合典型实战案例,提供可复制的工程落地路径。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3091

【YOLOv11】006、YOLOv11数据增强策略:Mosaic、MixUp等增强技术原理解析

摘要:YOLOv11在产线缺陷检测中遇到小尺寸瑕疵漏检问题,暴露了训练数据过于"干净"的缺陷。数据增强的核心是提升模型泛化能力,而非简单扩充数据。Mosaic增强通过多图拼接迫使模型处理多尺度目标,需注意边界框裁剪细节;MixUp通过线性插值使决策边界更平滑,但需避免类别冲突。自适应增强策略应随训练进度动态调整强度。实际应用中,需针对小目标、类别不平衡等场景调整增强参数,并确保验证与推理流程一致。数据增强应针对性解决具体问题,而非盲目尝试组合。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 365

广度优先搜索和深度优先搜索

假设从a结点开始访问,a先入队。例题:在一个n*m的矩阵上,分布着如下数字,0代表通路,1代表墙,无法通行,2代表起点,3代表终点,4代表陷阱,6代表炸弹,现在要求从起点到终点的最短路径,0可以通行,1无法通行,陷阱则需要花费3个单位时间,6可以把上下左右的四个坐标炸为通路,请给出从起点到终点的最短距离。在广度遍历的过程中,我们可以得到一棵遍历树,称为广度优先生成树,需要注意的是,一给定图的邻接矩阵存储表示是唯一的,故其广度优先生成树也是唯一的,但由于邻接表存储表示不唯一,故其广度优先生成树也是不唯一的。

liulanba的博客 6507

国科大学习资料--模式识别与机器学习(黄庆明)--期末复习题2(含答案)

国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) 国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) 国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) ...

无名何许人的博客 1万+

图的遍历之 深度优先搜索和广度优先搜索

它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。在第1步访问A之后,接下来应该访问的是A的邻接点,即"C,D,F"中的一个。

Lamb的博客 2707

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

树的深度优先遍历 && 广度优先遍历

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

藿香正气的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python实现 宽度/广度优先搜索算法, 深度优先搜索算法

Python实现 宽度/广度优先搜索算法, 深度优先搜索算法1. 二叉树图2. 宽度/广度优先搜索算法(Breadth First Search,BSF)3. 深度优先搜索算法4. 宽度/广度优先搜索算法实现5. 深度优先搜索算法实现6. 完整代码实现 1. 二叉树图 2. 宽度/广度优先搜索算法(Breadth First Search,BSF) 工作原理: 从图中某顶点v出发,首先访问定点v 在访问了v之后依次访问v的各个未曾访问过的邻接点; 然后分别从这些邻接点出发依次访问它们的邻接点,并使得“

weixin_44065078的博客 3027

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

DFS和BFS(广度优先搜索和深度优先搜索)5个经典例子

DFS和BFS(广度优先搜索和深度优先搜索)5个经典例子 看完必会深搜和广搜

G_GUi的博客 6454

分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_图搜索

目录:深度优先搜索广度优先搜索深度优先搜索:深度优先搜索(Depth First Search,DFS),是最常见的图搜索方法之一。深度优先搜索沿着一条路径一直走下去,无法行进时,回退到刚刚访问的结点。深度优先遍历是按照深度优先搜索的方式对图进行遍历。深度优先遍历秘籍:后被访问的顶点,其邻接点先被访问。根据深度优先遍历秘籍,后来先服务,可以借助于栈实现。递归本身就是使用栈实现的,因此使用递归方法更...

weixin_39999859的博客 3736

python实现图的深度优先搜索和广度优先搜索

要用的图 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直

chuangshishen0的博客 4103

深度优先搜索_图解深度优先搜索和宽度优先搜索

1、深度优先算法占内存少但速度较慢,广度优先算法占内存多但速度较快,在距离和深度成正比的情况下能较快地求出最优解。2、深度优先与广度优先的控制结构和产生系统很相似,唯一的区别在于对扩展节点选取上。由于其保留了所有的前继节点,所以在产生后继节点时可以去掉一部分重复的节点,从而提高了搜索效率。3、这两种算法每次都扩展一个节点的所有子节点,而不同的是,深度优先下一次扩展的是本次扩展出来的子节点...

weixin_39821604的博客 4932

数据结构上机实验——图的实现(以无向邻接表为例)、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)

数据结构上机实验、要求、图的实现(以无向邻接表为例)、创建图、定义图的顶点、边及类定义、创建无向图和查找、插入边、打印函数、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)、全部源码、测试、Graph.h、test.cpp

Crocodile1006的博客 2063
上一篇: 网状结构(图)的基本知识——图的基本概念
下一篇: 进了985、211才知道:优秀的朋友圈,有多重要?
黑色吊椅
博客等级 码龄9年 102粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值