skill:树的重心
定义:对于一个点,将这个点删去后,剩下的图上最大的强连通分量大小不大于原图总点数的一半
一颗树上有1到2个重心。
让我们随便建一棵树,树的重心就是3或5
那么树的重心怎么求呢
在这里先介绍dfs版
按照定义,我们可以用递归求出一个点的所有子树大小
当然要判断原树减去这个点及其子树后的树(即“上方子树”)也就是总大小-以该点为根的树大小
void sett(int s,int fa) { size[s]=1; f[s]=0; for(int i=head[s];i;i=edge[i].nxt) { int to=edge[i].to; if(to==fa)continue; sett(to,s); size[s]+=size[to]; f[s]=max(f[s],size[to]); } f[s]=max(f[s],steps-size[s]);steps为树的大小 if(f[s]<f[root])root=s;//如果要求所有重心的话应把条件改为(f[s]*2<=steps)满足即为重心 }
(可简单了)