[蓝桥杯知识学习] 树链

DFS序

什么是DFS序

怎么求DFS序

进入操作,将有计数++

出:可以理解为,没有孩子可以去了(不能,向下行动:对应于程序里的入栈),所以回到父结点(向上行动,对应于程序里的出栈)

总体行动:

  1. 进入结点,计数++,赋值:入=当前计数

  2. 如果可以向下,则重复1操作

  3. 如果没有可以向下的了,则,在当前结点:赋值出=当前计数,回到父结点,重复2操作

代码实现

我自己写的,更好懂

cpp 复制代码
//多叉树
int inn[100000];  //dfs入序
int out[100000];   //dfs出序
int weight[100000];  //权重
vector<int> edge[100000];  //用来放结点的子结点
int cnt;  //dfs序计数器

//生成dfs序
void dfs(int t,int f)
{
  inn[t] = ++cnt;
  for(int i = 0 ; i < edge[t].size() ; i++)
  {
    dfs(edge[t][i],t);
  }
  out[t] = cnt;
  return ;
}

其实就是三段论

用一个数组 in 存放该结点的入序,遍历这个结点所有的子结点,用一个数组 out 放出序

DFS序的性质

  1. 某些连续的入序对应树中的节点是一条链

2.某节点入序和出序之间对应的节点一定在其子树中

某结点的子树,其子树上的结点入序数都大于该结点,出序数都小于该结点。(这个好理解,要先进入这个结点,才能向下;向上的话,这个结点在最上方)

出序,一路退出,和最后进入的结点计数值相同

in[t] < t的子树的DFS序 < out[t]

例题

涉及到子树,所以用DFS序

解释,为什么第一个操作用的是 in[x] (某点的DFS序值),因为我们使用DFS序值当作数组下标,来记录点的点权,方便第二个操作的进行。

解释第二个操作:使用DFS序的第二个性质,in[x] 与 out[x] 之间是x子树结点的DFS序。

相关推荐
黎宇幻生26 分钟前
Java全栈学习笔记33
java·笔记·学习
2501_926227941 小时前
.Net程序员就业现状以及学习路线图(五)
学习·.net
汉克老师1 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
c++·算法·蓝桥杯·01背包·蓝桥杯c++·c++蓝桥杯
Jared_devin4 小时前
二叉树算法题—— [蓝桥杯 2019 省 AB] 完全二叉树的权值
数据结构·c++·算法·职场和发展·蓝桥杯
siy23335 小时前
[c语言日记] 数组的一种死法和两种用法
c语言·开发语言·笔记·学习·链表
在路上`7 小时前
前端学习之后端java小白(三)-sql外键约束一对多
java·前端·学习
尚久龙7 小时前
安卓学习 之 用户登录界面的简单实现
android·运维·服务器·学习·手机·android studio·安卓
yb0os17 小时前
RPC实战和核心原理学习(一)----基础
java·开发语言·网络·数据结构·学习·计算机·rpc
乱飞的秋天7 小时前
网络编程学习
网络·学习·php
2202_755744308 小时前
开学季技术指南:构建高效知识管理系统与学习工作流
学习