樹的重心,也叫樹的質心。即樹的乙個點,以它為根時所有子樹最大子樹最小。刪去重心後,生成的多棵樹盡可能平衡。
在樹的點分治中通常要用到。
性質
樹中所有點到某個點的距離和中,到重心的距離和是最短的。如果有兩個重心,它們的距離和相等。
把兩棵樹用一條邊相連,新的樹的重心在原來兩棵樹的重心的連線上。
一棵樹新增或刪除乙個節點後,樹的重心最多隻移動一條邊的位置。
一棵樹最多有兩個重心,且相鄰。
求法
先任意取乙個點作為根,在這棵樹上求出每乙個子樹的大小,對每個結點求它的各個子樹的最大大小,若 v 是 u 的子樹,那麼 max
size
u=ma
xmaxsize_u=max\
maxsiz
eu=
max。dfs 一遍 o(n) 求出。
#include
#include
#include
#include
using
namespace std;
const
int n=
1e5+10;
int n;
//edge
struct edge
e[n]
;int hn, h[n]
;void
add(
int u,
int v)
//weight
int sz[n]
, pos, minz;
void
dfs(
int u,
int fa)
maxz=
max(maxz,n-sz[u]);
if(maxz}int
main()
minz=n;
dfs(1,
0);printf
("%d"
, pos)
;return0;
}
演算法程式設計 樹的重心 DFS
題目 給定一顆樹,樹中包含n個結點 編號1 n 和n 1條無向邊。請你找到樹的重心,並輸出將重心刪除後,剩餘各個連通塊中點數的最大值。重心定義 重心是指樹中的乙個結點,如果將這個點刪除後,剩餘各個連通塊中點數的最大值最小,那麼這個節點被稱為樹的重心。輸入格式第一行包含整數n,表示樹的結點數。接下來n...
求樹的重心
題目 題意 給定一棵樹,求樹的重心的編號以及重心刪除後得到的最大子樹的節點個數size,如果size相同就選取編號最小的.分析 首先要知道什麼是樹的重心,樹的重心定義為 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵 樹的重心,刪去重 心後,生成的多棵樹盡可能平衡.實際上樹的重心...
專題 樹的重心
定義1 找到乙個點,刪除它得到的森林中最大的子樹節點數最少,那麼這個點就是這棵樹的重心。定義2 刪除重心後得到的所有子樹,其頂點樹必然不超過n 2 性質1 樹中所有點到某個點的距離和中,到重心的距離和是最小的 如果有兩個重心,那麼他們的距離和一樣。性質2 把兩個樹通過一條邊相連得到乙個新的樹,那麼新...