首页 > 其他分享 >dfs理解

dfs理解

时间:2023-04-01 23:24:15浏览次数:39  
标签:int 邻边 dfs 叶子 理解 当前 节点

dfs理解

201 深搜(DFS)哔哩哔哩bilibili

董晓 - 博客园 (cnblogs.com)

深搜的时机

  • 在扩展当前节点的邻边之前,即for当前节点的儿子节点之前,刚进入当前这个节点。
  • for完当前节点的所有儿子节点之后,要离开当前节点了。
  • 开始for当前节点的扩展邻边时,即刚从当前节点出去。此时可以从父节点向儿子节点传一些信息。
  • 遍历完当前儿子节点的情况,回到当前节点。此时可以计算儿子节点的个数等值。

注意:for内的循环语句是在要在当前节点的函数空间内执行多次的!

所以一定要注意两点:

  1. 是要由父节点算子节点,即父节点信息维护子节点信息。-----> 自顶向下
  2. 还是由子节点算父节点,即自底向上。

经典父节点向子节点传递信息的例题

4946. 叶子节点 - AcWing题库

给定一棵 个节点的树,节点编号 。

号节点为树的根节点。

每个节点要么是黑色的,要么是白色的。

对于一个叶子节点,如果从该节点到根节点的路径(包括两端节点)中有超过 个黑色节点连续的排列在一起,则称该节点为无效叶子节点。

有效叶子节点数量 = 总叶子节点数量 - 无效叶子节点数量

请你统计,给定树中有效叶子节点的数量。

输入格式

第一行包含两个整数 。

第二行包含 个整数 ,其中 表示第 个节点的颜色, 表示黑色, 表示白色。

接下来 行,每行包含两个整数 ,表示节点 和节点 之间存在一条无向边。

保证输入给定的是一棵树。

输出格式

一个整数,表示给定树中有效叶子节点的数量。

数据范围

前 个测试点满足 。
所有测试点满足 ,,,,。

输入样例1:

4 1
1 1 0 0
1 2
1 3
1 4

输出样例1:

2

输入样例2:

7 1
1 0 1 1 0 0 0
1 2
1 3
2 4
2 5
3 6
3 7

输出样例2:

2

#include <bits/stdc++.h>
using namespace std;
const int N = 100010,M = 2*N;
int h[N],e[M],ne[M],w[N],idx;
int n,m;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u,int fa,int cnt,bool valid)
{
// 扩展当前点的邻边之前,先更新当前节点,即相当于是从父节点向子节点传递信息
if (w[u]) cnt++;
else cnt=0;

if (cnt>m) valid=false;

int son=0; // 记录当前节点的儿子节点个数,只有son==0时,才是叶子结点
int res=0; // 记录当前节点所在子树符合的叶子结点个数

// 开始扩展当前节点的邻边
for (int i=h[u];~i;i=ne[i])
{
int j =e[i];
if (j==fa) continue;
son++; // 这时候更新当前节点的儿子节点个数
res+=dfs(j,u,cnt,valid);
}

// 当前节点的所有扩展邻边已经遍历完毕,回到了当前节点。
// 这时候判断一下当前节点是否没有儿子节点(即是叶子结点)并且符合要求
if (!son && valid) res++;

return res;
}
int main()
{
scanf("%d%d",&n,&m);
memset(h,-1,sizeof h);
for (int i=1;i<=n;i++) scanf("%d",&w[i]);

for (int i=0;i<n-1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b),add(b,a);
}

int ans = dfs(1,-1,0,1);
printf("%d\n",ans);
return 0;


}

标签:int,邻边,dfs,叶子,理解,当前,节点
From: https://www.cnblogs.com/sdnu-dfl/p/17279670.html

相关文章

  • 如何理解信息隐藏和局部化?用自己的话或者例子表达其含义
      信息隐藏是指在一个系统或者数据中,有一些信息是被隐藏起来的,不被直接展示或者访问的。这些信息可能是敏感信息,需要保密,或者是不必要的信息,不需要被用户或者其他系统访问。例如,在一个网站的后台管理系统中,管理员可以看到所有用户的个人信息,但是普通用户只能看到自己的信息,这......
  • AcWing 第 97 场周赛 ABC(dfs)
    https://www.acwing.com/activity/content/competition/problem_list/3088/果然绩点成绩和竞赛水平总得寄一个(tome4944.热身计算#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18,MINN=-MAXN,INF=0x3f3f3......
  • Git提交本地项目到云端仓库(学习理解持续更新)
    进入项目文件夹初始化本地仓库gitinit把所有文件添加到版本库中gitadd.查看添加的文件gitstatus......
  • 深度学习之量化概念初步理解
    也许标题并不是很对,但一再听到有人提起量化这个词,搜索了下,稍作整理如下:量化任务的简要总结:1、量化映射方法,也就是将float-32映射到Int数据类型,每个间隔是相等的还是不相等的,这里就是均匀量化(uniformquantization)和非均匀量化(non-uniformquantization),也可以叫作线性量化和......
  • 从原理上理解Spring如何解决循环依赖
    上图展示了循环依赖是什么,类A存在B类的成员变量,所以类A依赖于类B,类B同样存在类A的成员变量,所以类B也依赖于类A,就形成了循环依赖问题。Spring是如何创建Bean的Spring中Bean初始化的精简流程如下:简要描述一下SpringBean的创建流程:(1)首先Spring容器启动之后,会根据使用不同类型......
  • 简单理解 DP 套 DP
    复制粘贴的:通过一个外层的DP来计算使得另一个DP方程最终结果为特定值的输入数。例如求有多少种输入使得一个背包DP恰好答案为\(K\)。外层DP的状态是所有子DP的状态的值。子DP状态数很少,通常经过滚动数组优化,比如\(3n\)变成\(2\times3\))通常我们有技巧地枚......
  • vue或者react中的hooks的理解
    我们听过react里面有hooks的概念,那么怎么理解hooks呢? 其实vue2中,我们没有hooks的概念,vue3中我们引入了组合式函数(也就是用组合式api写的),它其实就是vue的hooks。 总结下来,hooks有以下特点:1、hooks其实就是个函数,只是实现它的方法比较特殊,利用组合式api实现的。2、组合式函......
  • hdfs disk balancer 磁盘均衡器
    目录1、背景2、hdfsbalancer和hdfsdiskbalancer有何不同?3、操作3.1生成计划3.2执行计划3.3查询计划3.4取消计划4、和diskbalancer相关的配置5、额外知识点5.1新的block存储到那个磁盘(卷)中5.2磁盘数据密度度量标准6、参考文档1、背景在我们的hadoop集群运行一段过......
  • R数据分析:生存分析的列线图的理解与绘制详细教程
    列线图作为一个非常简单明了的临床辅助决策工具,在临床中用的(发文章的)还是比较多的,尤其是肿瘤预后:Nomogramsarewidelyusedforcancerprognosis,primarilybecauseoftheirabilitytoreducestatisticalpredictivemodelsintoasinglenumericalestimateoftheprob......
  • HDFS Balancer负载均衡器
    目录1、背景2、什么是平衡2.1每个DataNode的利用率计算2.2集群的利用率2.3平衡3、hdfsbalancer语法4、运行一个简单的balance案例4.1设置平衡数据传输带宽4.2执行ban......