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)满足即为重心
}

(可简单了)

 

posted @ 2019-01-09 21:10  stepsys  阅读(138)  评论(0编辑  收藏  举报

*/