模板 樹的重心

2021-08-11 16:21:32 字數 628 閱讀 9671

[模板]

求樹的重心

[任務]

求樹的重心

[介面]

vector

way[maxn] 無向圖

int siz 該節點的子節點個數(包括自己)

int mu 該節點的(最大,節點數最多)子樹的節點數

allnode 根節點的子節點個數 = siz(root)

int getroot(int u,int fa) 返回以u為根節點的子樹的重心,fa為u的父節點(防止回去);

void dfsize(int u,int fa) 建立siz陣列和mu陣列(以u為根節點)

void dfsroot(int u,int fa,int allnode,int &root) 通過之前建立的siz陣列和mu陣列得到重心.(allnode = siz[u])

[**]

void dfsize(int u,int fa)

}void dfsroot(int u,int fa,int allnode,int &root)

}int getroot(int u,int fa)

模板 樹的重心

定義 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡。首先,利用前向星存邊建立邊表。由於無向,所以要連兩次邊。我們用一次 df s dfs 建立以1為根節點時每個結點所在子樹的結點數。接下來考慮把這個點刪掉的結果,如果乙個非根結點有 p...

樹的重心 模板

刪除重心後,子樹的最大權值最小 dfs遍歷每個點,node的所有子樹除了它的兒子們還有它往父親那個方向的一顆子樹 權值 總權值 所有子樹權值和 1 下面的 權值為邊權 include using namespace std const int maxn 1e5 100,inf 0x3f3f3f3f ...

樹的重心 poj3701 模板題

樹的重心也叫樹的質心。找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡。思路 dfs深搜 回溯 poj3701 有多個重心 ac include include include include include include includ...