一、题目目录
1.最小DFS序
二、题目描述暨题解
1.最小DFS序
时间限制:1秒 内存限制:128M
题目描述
对于多叉树(多叉树包含二叉树)而言,如我们删除一个节点x后,原来的树可能会分成若干个不相连的部分,其中每个部分都是一棵子树。设max_part(x)表示在删除节点x的所有子树中,最大的一棵树的大小。使max_part的函数取到最小值的节点p就被称为整棵树的重心。
1.删除重心后所得的所有子树,节点数不超过原树的1/2,一棵树最多有两个重心;
2.树中所有节点到重心的距离之和最小,如果有两个重心,那么他们距离之和相等;
3.两个树通过一条边合并,新的重心在原树两个重心的路径上;
4.树删除或添加一个叶子节点,重心最多只移动一条边;
现在给你一颗多叉树,请你求出这棵树的重心(保证树的重心唯一)。
输入描述
第一行,两个整数n,s,其中n(1<=n<=100000)表示树节点的个数,s表示根节点的编号。
接下来的n-1行中,每行有两个整数x,y,表示x和y有一条边。
输出描述
输出占一行,1个数,输出树的重心所在的节点号和最大子树的节点个数。
样例
输入
9 1 1 2 1 7 1 4 2 8 2 5 4 6 4 3 3 9
输出
1 4
DFS序是指:每个节点在DFS时在系统栈内的时间顺序(出栈与入栈,都会记录)
举了个例子: