‹ 上一题 下一题 ›

g6-09077. 爆栈判定 未做

1000 ms 256 MB 测试点 10 通过率 50% GESP-66级·树形DP入门复杂度分析阶梯·进阶

题目描述

给一棵 个结点的树( 条无向边)和一个递归栈容量上限 :递归实现的深度优先遍历从结点 出发时,任意时刻同时在栈上的递归层数不能超过 。

树高 定义为:从结点 出发,最深的一条链上的结点数(结点 自己算第 层)。深度优先遍历会沿一条链一探到底再回溯,所以需要的最大递归层数恰好等于 。

输出两行:第一行输出 ;第二行,若 (会爆栈)输出 YES,否则输出 NO。

想一想: 可达 ,本题的求解程序自己会不会先爆栈?

输入格式

第一行两个整数 ,分别表示结点数与递归栈容量上限。

接下来 行,每行两个整数 ,表示树上一条无向边。

输出格式

共两行:第一行一个整数 ;第二行 YES 或 NO。

样例

输入
6 2
1 2
1 3
1 4
1 5
1 6
输出
2
NO

数据范围

  • ,,保证 条边构成一棵连通的树
  • 输入最多约 个整数,请使用 scanf 或关闭同步的 cin 等快速读入方式

背景知识

树高:从根 出发,最深的链上有多少个结点,树高就是多少;根自己算第 层。链 的树高是 ;只有中心与 片叶子的星形树,树高是 。

递归栈:程序每递归调用一层,调用栈上就叠起一帧;沿树的一条链一路递归到底,栈上同时叠着的层数等于这条链的结点数。 的链需要 层栈帧,常见的栈空间(如 MB)根本放不下,程序会直接崩溃——这就是树形 DP 遇到链形数据必须把递归改成**迭代(BFS 或显式栈)**的原因。判定会不会爆栈,其实就是比较树高 与栈上限 的大小。

输入
输出

            
答案