当前位置: 首页 > news >正文

D005 求子树大小的四种方法 树形结构 递归 栈模拟递归 CSES 1674

1674 Subordinates CSES Python推荐使用 Pypy3 编译器和一次性读入字符串的方式和方法一或方法四,不然会被卡掉最后一个点

最基础的树论题,考察对递归的应用和对树形结构的理解。

返回值累加

DFS 函数返回当前子树的大小,父节点拿到子节点的返回值后累加到自己身上。

sz = [0] * (n + 1)def dfs(u, fa=-1):cur = 1for v in g[u]:if v != fa:cur += dfs(v, u)sz[u] = curreturn curdfs(1) # 1-based

全局更新

此时 DFS 函数不返回子树大小而是在回溯时利用引用或全局数组来更新子树大小。这种写法 DFS 的返回值求别的东西,子树大小只是副产物。

sz = [0] * (n + 1)def dfs(u, fa=-1):sz[u] = 1for v in g[u]:if v != fa:dfs(v, u)sz[u] += sz[v]
dfs(1)

时间戳差值

利用时间戳的性质可知,子树的大小为:离开时间 - 进入时间 + 1

timer = 0
tin = [0] * (n + 1)
tout = [0] * (n + 1)
sz = [0] * (n + 1)def dfs(u, fa=-1):nonlocal timertimer += 1tin[u] = timerfor v in g[u]:if v != fa:dfs(v, u)tout[u] = timersz[u] = tout[u] - tin[u] + 1dfs(1)

栈模拟递归

递归开销太大了,很容易超时和栈溢出( \(2\times 10^5\) 时),所以会手写递归是非常重要的。方法二三会超时,但一和四不会。

拓扑逆序法

逻辑和 bfs 很相似。

order = []  # 存先序结果,即 dfs 序
sz = [1] * (n + 1)
fa = [-1] * (n + 1)st = [1] 
while st:u = st.pop()order.append(u)for v in g[u]:if v != fa[u]:fa[v]= ust.append(v)for i in range(len(order)-1, -1, -1):u = order[i]p = fa[u]if p != -1:sz[p] += sz[u]

状态标记法

使用 (节点,状态) 二元组

  1. 当状态为 \(0\) 时,表示第一次访问的节点。对应递归函数的入口用于处理先序的逻辑
  2. 状态为 \(1\) 时,表示子节点已经全部访问过,回溯时该部分用于处理后序的逻辑
sz = [0] * (n + 1)
st = [(1, 0)]
while st:u, state = st.pop()if state == 0:# 先序逻辑,比如 tin[u] = len(order) 等操作st.append((u, 1))for v in g[u]:  # 注意这里按一些题目要求可能需要排序st.append((v, 0))else:# 后序遍历的逻辑cur = 1for v in g[u]:cur += sz[v]sz[u] = cur
http://www.jsqmd.com/news/421875/

相关文章:

  • AI赋能安全 | 悬镜安全荣登《ISC.AI 2025创新性案例报告》
  • vscode下nodejs开发准备
  • Unity3d笔记
  • 美甲美发“效果预览数字模板”,减少沟通误差。
  • 题解:洛谷 B2027 计算球的体积
  • 农村创业者,农产品数字艺术包装,提升档次。
  • FastAPI 学习教程 · 第8部分
  • AI模型——Ming-Lite-Omni-1.5多模态全能助手[特殊字符]
  • FastAPI 学习教程 · 第7部分
  • AI vs Human图像分类模型 [特殊字符][特殊字符]‍[特殊字符] 60K数据训练
  • 题解:洛谷 B2028 反向输出一个三位数
  • OpenClaw 架构设计全解析
  • 向量数据库基础认识
  • Anthropic CEO Dario Amodei:海啸已在地平线上,但没人在看
  • 加密狗防丢失与备份策略
  • 题解:洛谷 B2026 计算浮点数相除的余
  • fs模块-路径动态拼接的问题
  • Spark与Arctic集成:流批一体数据湖方案
  • AI辅助写作:提升技术文档创作效率的秘诀
  • 题解:洛谷 B2024 输出浮点数
  • 2026年AI智能产品开发行业谁在定义新标准?
  • 2.28总结
  • 2、Python数据结构与函数(配套函数)
  • 软考2026上半年报名在即,这几项资料请提前准备!
  • 基于STM32F103为主控的5KW 混合储能系统48V电池+500V光伏+220V逆变(AD...
  • 大数据处理中 Kafka 的安全配置与防护
  • 3、Python进阶操作
  • 题解:洛谷 B2022 输出保留 12 位小数的浮点数
  • Tita AI 场景化攻略:AI生成项目,让项目规划不再茫然
  • 博客索引