植树
Submit solution
Points:
100
Time limit:
1.0s
Memory limit:
80M
Author:
Problem type
Allowed languages
C, C++
植树
题目背景
Ysuperman 响应号召,决定在幼儿园里植树。
题目描述
给你一棵 无根树 (无向、连通、无环) (T),共有 n 个结点,结点编号为 1..n。
Ysuperman 研究发现:一个结点 x 可以作为根 的充要条件是——当把整棵树视为以 x 为根的有根树时,与 x 直接相连的每个相邻结点所对应的"子树大小"都相同。
更具体地说:
把树以 x 为根后,x 的每个相邻结点 y 都对应一个连通块("子树"):
- 若
y是x的孩子,则该子树的大小就是以y为根的子树节点数size[y]; - 若
x与其父方向相连(等价于从x往"上方"离开x的那一块),其大小为n - size[x](若该值大于 0 才参与比较)。 只有当这些块大小全部相等时,x才是一个"可作为根"的结点。
请你在 1 秒 内找出 所有 可以作为根的结点,并按从小到大顺序输出。
输入格式
- 第一行:一个正整数
n—— 节点个数。 - 接下来的
n-1行:每行两个正整数u v\(1 \le u, v \le n\),\(u \neq v\),表示在结点u和v之间有一条无向边。 保证输入各边互不重复且构成一棵树(连通、无环)。
输出格式
输出一行,包含若干个从小到大的整数,表示所有可以作为根的结点编号。编号之间用单个空格分隔。
若所有结点都可以作为根,则输出 1 2 … n。
样例
样例 1
输入
2
1 2
输出
1 2
样例 2
输入
4
1 2
2 3
3 4
输出
1 4
样例 3
输入
9
1 2
1 3
4 1
5 1
1 6
1 9
8 1
1 7
输出
1 2 3 4 5 6 7 8 9
数据范围与约定
- 结点编号:
1..n。 - 本题采用捆绑测试。
| 子任务 | 约束 | 分值 |
|---|---|---|
| 1 | \(n \le 5000\) | 40 |
| 2 | \(n \le 1000000\) | 60 |
对所有测试数据:\(1 \le n \le 10^6\)。
提示:输入输出体量大,建议使用快速读写。
Comments