树与图的深度优先遍历

article/2025/9/20 6:41:15

目录

一、概念

二、操作说明

1.树与图的深度优先遍历

2.树的DFS序 

3.树的深度

4.树的重心

5.图的连通块划分

三、例题实践

1.树的重心例题实战

a.题目描述

b.解题思路

c.代码实现


一、概念

树与图的深度优先遍历:深度优先遍历,就是在每一个点x上面对多条分支时,任选一条边走下去,执行递归,直至回溯到点x后,再考虑其他的边。

树的DFS序:在对树进行深度优先遍历时,对于每一个节点,在刚进入递归后以及即将回溯前各记录一次该点的编号,最后产生的长度为2N的节点序列就被称为树的DFS序。

树的深度:树中的各个节点的深度是一种自顶向下的统计信息,大小为由节点到到根节点的距离。

树的重心:在删除一个节点后,一棵树可能会产生多个子树,其中能使产生子树的最大值最小的节点,就被称为整棵树的重心。

图的连通块:若在无向图的一个子图中,任意两个节点之间都存在一条路径(可相互到达),且该子图是不能再扩张的,则称该子图为无向图的一个连通块。

注:树与图最常见的存储方式就是使用一个邻接表保存它们的边集

二、操作说明

1.树与图的深度优先遍历

遍历形式如图1所示

图1

 

int h[N],e[M],ne[M],idx; ///邻接表结构
bool st[N];void dfs(int u){st[u]=true; ///标记已遍历过的点for(int i=h[u];i!=-1;i=ne[i]){ ///遍历与点u相连的点int j=e[i]; ///将与点u相连的点存入jif(!st[j])  dfs(j); ///若点j未被遍历过,则对与点j相连的点进行搜索}}

2.树的DFS序 

DFS序的特点是:每个节点的编号在序列中恰好出现两次。设这两次出现的位置为L[x]和R[x],那么闭区间[L[x],R[x]]就是以x为根的子树的DFS序。样例如图2

图2
void dfs(int u){a[++m]=u; ///a数组存储DFS序st[u]=true;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j])  dfs(j);}a[++m]=u;
}

3.树的深度

树的根节点深度为0。若结点u的深度为d[u],则它的子节点j深度为d[j]=d[u]+1。样例如图3所示。

图3

 

void dfs(int u){st[u]=true;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j])  {d[j]=d[u]+1; ///子节点的深度等于父节点加1dfs(j);}}
}

4.树的重心

以图4为例,删除节点4。以节点4为根的子树其大小为4,删去节点4后可产生三个子树,其中以节点4为根的子树中产生了两个子树3,6,其大小为2,1。第三个子树不由以4为根的子树部分组成,而是由除以4为根的子树外的其他部分组成,其大小为整棵树大小减去以4为根的子树的大小。

图4
void dfs(int u){st[u]=true;size[u]=1; ///以u为根的子树初始时含有子树的根节点,其大小为1int max_part=0; ///存储在去除节点u后,产生的子树的最大值for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j])  {dfs(j);size[u]+=size[j]; ///将子树u的其余部分加入到子树中///记录去除节点u后产生的子树中的最大值(以u根节点的子树中的一部分形成的子树)max_part=max(max_part,size[j]); }}///非以u根节点的子树中的一部分形成的子树,也需要比较记录max_part=max(max_part,n-size[u]); 
///判断删除当前节点产生的最大子树是否比已记录的删去节点后产生的子树最大值中的最小值更小if(max_part<ans){ ans=max_part; ///将记录的最小值改为删去当前节点产生的子树最大值pos=u; ///记录该结点}
}

5.图的连通块划分

划分方法,将图的每一个没有被遍历过的点都遍历一次,将每一个遍历到的点所连通的点都记为同一个连通块。以图5为例。

图5

 

void dfs(int u){st[u]=true;v[u]=cnt; ///标记该点属于第cnt个连通块for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j])  {dfs(j);}}
}
for(int i=1;i<=n;i++){if(!st[i]){cnt++; ///连通块个数dfs(i);}
}

三、例题实践

1.树的重心例题实战

a.题目描述

给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。

请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

输入格式

第一行包含整数 n,表示树的结点数。

接下来 n−1 行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。

输出格式

输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。

数据范围

1≤n≤1e5

输入样例

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6

输出样例:

4

b.解题思路

思路:按题目要求操作

c.代码实现

#include<iostream>
#include<cstring>using namespace std;const int N=1e5+10,M=2*N;int ans=N;
int h[N],e[M],ne[M],idx;
bool st[N];
int n;void add(int a,int b){e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}int dfs(int u){st[u]=true; ///标记已遍历过的点int size_u=1;///以u为根的子树初始时含有子树的根节点,其大小为1int max_part=0; ///存储在去除节点u后,产生的子树的最大值for(int i=h[u];i!=-1;i=ne[i]){///遍历与点u相连的点int j=e[i]; ///将与点u相连的点存入jif(!st[j])  {///若点j未被遍历过,则对与点j相连的点进行搜索int size_j=dfs(j);///记录去除节点u后产生的子树中的最大值(以u根节点的子树中的一部分形成的子树)max_part=max(max_part,size_j);size_u+=size_j;///将子树u的其余部分加入到子树中}}///非以u根节点的子树中的一部分形成的子树,也需要比较记录max_part=max(max_part,n-size_u);///与已记录的删去节点后产生的子树最大值中的最小值比较,取最小值ans=min(ans,max_part);return size_u;
}int main(){memset(h,-1,sizeof h); ///初始表头scanf("%d",&n);for(int i=0;i<n-1;i++) {int a,b;scanf("%d%d",&a,&b);add(a,b),add(b,a); ///添加双向边到图中}dfs(1);cout <<ans <<endl;return 0;
}


http://chatgpt.dhexx.cn/article/3odyK5qp.shtml

相关文章

算法总结-深度优先遍历和广度优先遍历

深度优先遍历(Depth First Search&#xff0c;简称DFS) 与广度优先遍历(Breath First Search&#xff0c;简称BFS)是图论中两种非常重要的算法&#xff0c;生产上广泛用于拓扑排序&#xff0c;寻路(走迷宫)&#xff0c;搜索引擎&#xff0c;爬虫等。 一、深度优先遍历 深度优先…

图的两种遍历:深度优先遍历+广度优先遍历

一、深度优先遍历 1、简介 深度优先遍历是指按照深度方向搜索&#xff0c;它类似于树的先根遍历&#xff0c;是树的先根遍历的推广。 基本思想&#xff08;通俗&#xff09; 选一条路走到 底&#xff0c;直到 走不通&#xff0c;就 原路返回看看 是否还有路可走&#xff0c;如…

C++实现图的深度优先遍历和广度优先遍历

图的深度和广度优先遍历 图的深度优先遍历1、算法思想2、邻接矩阵构造图3、邻接表构造图 图的广度优先遍历1、算法思想2、邻接矩阵构造图 参考 图的深度优先遍历 1、算法思想 &#xff08;1&#xff09;从图中的某个初始点 v 出发&#xff0c;首先访问初始点 v.&#xff08;…

深度优先遍历

1.先序序列为a,b,c,d 的不同二叉树的个数是 &#xff08;14&#xff09; 。 13 14 15 16 f&#xff08;n&#xff09;c(n 2n)/n1 2.在构建哈弗曼树时&#xff0c;要使树的带权路径长度最小&#xff0c;只需要遵循一个原则&#xff0c;那就是&#xff1a;权重越大的结点离树…

图的遍历——深度优先遍历与广度优先遍历

目录 何谓遍历&#xff1f; 图的遍历特点 图的遍历方式 深度优先搜索 过程分析 案例分析&#xff1a; 算法的代码实现 测试案例&#xff1a; 测试结果如下&#xff1a; 遍历非连通图 算法复杂度分析 额外补充 广度优先搜索 过程分析 辅助队列 算法的代码实现 队…

图的深度优先遍历和广度优先遍历

本文参考自《大话数据结构》 文章目录 定义图的存储结构邻接矩阵邻接表 图的遍历深度优先遍历邻接矩阵代码邻接表代码 广度优先遍历邻接矩阵邻接表 最小生成树最短路径算法 定义 图(Graph) 是由顶点的有穷非空集合和顶点之间边的集合组成&#xff0c;通常表示为G(V&#xff0…

深度优先遍历和广度优先遍历

深度优先遍历和广度优先遍历 什么是 深度/广度 优先遍历&#xff1f; 深度优先遍历简称DFS&#xff08;Depth First Search&#xff09;&#xff0c;广度优先遍历简称BFS&#xff08;Breadth First Search&#xff09;&#xff0c;它们是遍历图当中所有顶点的两种方式。 这…

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

1、深度优先搜索遍历过程 图的深度优先搜索(Depth First Search)&#xff0c;和树的先序遍历比较类似。 它的思想&#xff1a;假设初始状态是图中所有顶点均未被访问&#xff0c;则从某个顶点v出发&#xff0c;首先访问该顶点&#xff0c;然后依次从它的各个未被访问的邻接点出…

图的遍历算法之深度优先遍历(DFS)(C++)

图的深度优先遍历思想是&#xff1a; 从图中某结点出发&#xff0c;访问其某一相邻结点&#xff0c;再访问该结点的相邻结点&#xff0c;直至访问完所有的结点。 形象的比喻就是&#xff1a;一条路走到头&#xff0c;回头再走没走过的路。 可见&#xff0c;深度优先遍历是一…

图的深度优先遍历

一 图遍历介绍 所谓图的遍历&#xff0c;即是对结点的访问。一个图有那么多个结点&#xff0c;如何遍历这些结点&#xff0c;需要特定策略&#xff0c;一般有两种访问策略。 1 深度优先遍历 2 广度优先遍历 二 深度优先遍历基本思想 图的深度优先搜索(Depth First Search…

图的遍历 ——深度优先遍历

图的遍历 ——深度优先遍历 深度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;是最常见的图搜索方法之一。 深度优先搜索沿着一条路径一直搜索下去&#xff0c;在无法搜索时&#xff0c;回退到刚刚访问过的节点。深度优先遍历是按照深度优先搜索的方式…

二、图的遍历——深度优先遍历

深度优先遍历&#xff0c;也有称为深度优先搜索&#xff0c;简称为DFS。 深度优先遍历其实就是一个递归的过程&#xff0c;它从图中某个顶点ⅴ出发&#xff0c;访问此顶点&#xff0c;然后从V的未被访问的邻接点出发深度优先遍历图&#xff0c;直至图中所有和V有路径相通的顶点…

图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

遍历的定义&#xff1a; 从已给的连通图中某一顶点出发&#xff0c;沿着一些边访遍图中所有的顶点&#xff0c;且使每个顶点仅被访问一次&#xff0c;就叫做图的遍历&#xff0c;它是图的基本运算&#xff0e; 一:深度优先遍历&#xff08;&#xff24;&#xff26;&#xff…

使用SSM框架上传图片

使用SSM框架上传图片 为了大家方便对照,我上传源码到网盘,有兴趣的自取. ps:其中有一个存储数据的网页,我没删除,可以忽略 链接&#xff1a;https://pan.baidu.com/s/1u24E8mUs4K-raoQgx-ae2A 提取码&#xff1a;java 建数据表 CREATE DATABASE my_resource;USE my_resource…

SSM框架简单介绍

一. SSM框架简介及特征 1.SpringMVC Spring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构&#xff0c;从而在使用Spring进行WEB开发时&#xff0c;可…

SSM框架整合详细教程

目录 1. 什么是SSM&#xff1f; 2. SSM整合的时候容器之间如何访问 3. SSM下面的开发步骤 4. SSM整合时候时容易混乱的知识点 1. 什么是SSM&#xff1f; SSM是对三个框架名字的简写&#xff0c;其中第一个S指的是SpringMVC,第二个S指的是Spring&#xff0c;第三个M指的是M…

SSM框架理解

一、作用&#xff1a; 1、 SSM是spingspringMVCmybatis集成的框架。是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层。 2、使用spring MVC负责请求的转发和视图管理&#xff0c;spring实现业务对象管理…

SSM框架初探

SSM 框架初探 SSM框架简介对框架的理解为什么使用 SSM 框架 SpringSpringMVCMybatis SSM框架简介 SSM框架一种以java语言作为后端搭建基本语言的应用系统搭建框架。是继SSH(strutsspringhibernate)之后&#xff0c;目前较为主流的Java EE企业级框架&#xff0c;适用于搭建各种大…

SSM框架整合

今天来整合一下SSM三大框架~~ 1、创建一个maven项目 比较简单就不赘述了&#xff0c;创建的时候选择webapp骨架。 用骨架创建的项目&#xff0c;在创建完之后要更新一下web.xml 模板目录&#xff1a;“你的Tomcat安装目录\webapps\ROOT\WEB-INF\web.xml” 2、项目整体结构 按…

SSM框架原理

SSM框架是spring MVC &#xff0c;spring和mybatis框架的整合&#xff0c;是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层 使用spring MVC负责请求的转发和视图管理 spring实现业务对象管理&#xff…