1. 程式人生 > >知識補充:樹的重心

知識補充:樹的重心

定義:對於一個點,將這個點刪去後,剩下的圖上最大的強連通分量大小不大於原圖總點數的一半

一顆樹上有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)滿足即為重心 }

(可簡單了)