题目描述
给一棵 个结点的树( 条无向边)和一个递归栈容量上限 :递归实现的深度优先遍历从结点 出发时,任意时刻同时在栈上的递归层数不能超过 。
树高 定义为:从结点 出发,最深的一条链上的结点数(结点 自己算第 层)。深度优先遍历会沿一条链一探到底再回溯,所以需要的最大递归层数恰好等于 。
输出两行:第一行输出 ;第二行,若 (会爆栈)输出 YES,否则输出 NO。
想一想: 可达 ,本题的求解程序自己会不会先爆栈?
输入格式
第一行两个整数 ,分别表示结点数与递归栈容量上限。
接下来 行,每行两个整数 ,表示树上一条无向边。
输出格式
共两行:第一行一个整数 ;第二行 YES 或 NO。
样例
输入
6 2 1 2 1 3 1 4 1 5 1 6
输出
2 NO
输入
5 3 1 2 2 3 3 4 4 5
输出
5 YES
数据范围
- ,,保证 条边构成一棵连通的树
- 输入最多约 个整数,请使用 scanf 或关闭同步的 cin 等快速读入方式
背景知识
树高:从根 出发,最深的链上有多少个结点,树高就是多少;根自己算第 层。链 的树高是 ;只有中心与 片叶子的星形树,树高是 。
递归栈:程序每递归调用一层,调用栈上就叠起一帧;沿树的一条链一路递归到底,栈上同时叠着的层数等于这条链的结点数。 的链需要 层栈帧,常见的栈空间(如 MB)根本放不下,程序会直接崩溃——这就是树形 DP 遇到链形数据必须把递归改成**迭代(BFS 或显式栈)**的原因。判定会不会爆栈,其实就是比较树高 与栈上限 的大小。