樹的重心求法 POJ 1655

2021-08-02 08:29:26 字數 1860 閱讀 4162

樹的重心,也叫樹的質心,可以這樣定義,對於一棵n個結點的無根樹,找到乙個點,使得把樹變成以該點為根的有根樹時,最大子樹的結點數最小,換句話說,刪除這個點之後的最大連通塊(一定是樹結構)的結點數最小

———劉汝佳

本文是對劉汝佳的樹的重心講解的衍生和解釋

求法是和樹的最大集問題類似的,先選乙個點作為根,然後把無根樹轉化為有根樹,設dp[i]表示以i為根的結點個數,不難發現(∑

j=so

n[i]

dp[j

] ) +1

顯然可以一遍dfs進行求解,那麼刪除結點i後,最大的連通塊有多少個節點呢,結點i的子樹中最大的是max(dp[j]),那麼i的上方子樹為n-max(dp[i]),其原因是我們可以想象乙個點,其上的父親以及上面的所有點(其實是除去i及i的所有子點的點),將其想象成乙個i的子樹,這樣一來,改點刪去之後最大的聯通塊的size就是max(max(dp[j]),n-dp[i]);

所以可以在dp的過程中找出樹的重心

**如下

上述是思路,然後寫了一道poj的裸題 poj1655

poj1655樹的重心

給定一棵樹,找出乙個點x,使得刪去x後,剩下的最大的子樹最小。解法 從上圖知,刪去點i後,形成的森林為點i的若干子樹與i 上方 的部分。s i 表示以i為根的子樹的大小 s i s j 1 s i 1 考慮每個節點i,剩下的最大子樹的大小maxsize i max,故計算出所有的maxsize i ...

poj 1655 樹的重心

題意 給了乙個樹,去掉乙個結點後的子樹的節點數的最大值即平衡值,求最小的平衡值,如果平衡值相同,使節點號最小。思路 其實也就是求樹的重心。樹的重心是找到乙個點使其所有子樹中節點個數最大的子樹的結點數目最小,使生成的樹盡可能平衡。其實 求樹的重心,只需要隨便找個點作為根dfs,求每個節點的每個子樹的節...

poj 1655 樹的重心

因為建立的樹實際上主要是記錄點的無向圖g,dfs u,r 的r是用來防止遍歷子節點時dfs到父節點,還用到了記憶化,並且是在一次dfs時求答案,效率有點低,ac用時300ms include include include include include include include includ...