http://blog.csdn.net/acdreamers/article/details/16905653
题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的.
分析:首先要知道什么是树的重心,树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重
心后,生成的多棵树尽可能平衡. 实际上树的重心在树的点分治中有重要的作用, 可以避免N^2的极端复杂度(从退化链的一端出发),保证
NlogN的复杂度, 利用树型dp可以很好地求树的重心.
#include #include #include #include #include #include #include #include #include #include #include #include #include #include
在这题里出现了这样一个情况,导致我第一次时TLE了
#define MAXN 20000+5struct node{ int y,val,next;}tree[MAXN*2];
因为是无向边,我习惯性地乘了2,导致结果错误。这里其实算出来的是20000+5*2 = 20010
改正有这样两种方法:
1.移位运算级低,可以直接用
#define MAXN 20000+5struct node{ int y,val,next;}tree[MAXN<<1];
2.define加括号
#define MAXN (20000+5)struct node{ int y,val,next;}tree[MAXN*2];