(由於本人太菜所以最近一直在補一些基礎演算法……)
求樹的重心的基本思想就是從每個節點出發分別遍歷一遍樹,統計max_part,其中能夠使得max_part最小的就是樹的重心
另外:一棵有根樹至多有兩個重心,這個結論好像有些題可以用(比如bzoj4337,不過那個資料太水只有50(什麼暴力亂搞都能過去),但據高三的dzyo神仙說資料可以出到1e6)
大部分的解釋都在**裡面(其實沒有什麼好解釋的……我解釋了下各個變數的意思)
/*
樹的重心定義:對於乙個樹中節點x,當我們刪去它時會將原來的樹分割成若干個不相連的部分,其中每個部分都是一顆子樹。
設max_part表示這些部分中最大的一棵子樹,若刪去節點x能夠使得max_part最小,則稱這個點為樹的重心
*/void dfs(int x)
max_part=max(max_part,n-size[x]);
if(max_part}
求樹的重心
題目 題意 給定一棵樹,求樹的重心的編號以及重心刪除後得到的最大子樹的節點個數size,如果size相同就選取編號最小的.分析 首先要知道什麼是樹的重心,樹的重心定義為 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵 樹的重心,刪去重 心後,生成的多棵樹盡可能平衡.實際上樹的重心...
專題 樹的重心
定義1 找到乙個點,刪除它得到的森林中最大的子樹節點數最少,那麼這個點就是這棵樹的重心。定義2 刪除重心後得到的所有子樹,其頂點樹必然不超過n 2 性質1 樹中所有點到某個點的距離和中,到重心的距離和是最小的 如果有兩個重心,那麼他們的距離和一樣。性質2 把兩個樹通過一條邊相連得到乙個新的樹,那麼新...
模板 樹的重心
模板 求樹的重心 任務 求樹的重心 介面 vector way maxn 無向圖 int siz 該節點的子節點個數 包括自己 int mu 該節點的 最大,節點數最多 子樹的節點數 allnode 根節點的子節點個數 siz root int getroot int u,int fa 返回以u為根...