以6做为重心,各个联通块的大小可分为以6为根节点的子树的大小,即以7为根的树的大小还有以3为根的树的大小,还有6上面的部分的大小
解决方法:
一般思路以所有点为重心进行模拟,但其实做了很多重复工作
第二种思路,任取一个节点做为根节点,进行dfs,如下:
int dfs(int u,int fa){
int size=0; //size记录以u为根节点的子树的最大节点树
int sum=0; //sum记录以u为根节点的所有子树的节点数之和
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
int s=dfs(v,u);
size=max(size,s);
sum+=s;
}
ans=min(ans,max(size,n-sum)); //n-sum为u上面的节点大小
return sum;
}
因为在dfs中,实际上每个节点都被当做重心计算过了。