植树


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 都对应一个连通块("子树"):

  • yx 的孩子,则该子树的大小就是以 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\),表示在结点 uv 之间有一条无向边。 保证输入各边互不重复且构成一棵树(连通、无环)。

输出格式

输出一行,包含若干个从小到大的整数,表示所有可以作为根的结点编号。编号之间用单个空格分隔。 若所有结点都可以作为根,则输出 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

There are no comments at the moment.