演算法 樹的重心

2021-10-04 09:24:26 字數 1033 閱讀 4286

樹的重心,也叫樹的質心。即樹的乙個點,以它為根時所有子樹最大子樹最小。刪去重心後,生成的多棵樹盡可能平衡。

在樹的點分治中通常要用到。

性質

樹中所有點到某個點的距離和中,到重心的距離和是最短的。如果有兩個重心,它們的距離和相等。

把兩棵樹用一條邊相連,新的樹的重心在原來兩棵樹的重心的連線上。

一棵樹新增或刪除乙個節點後,樹的重心最多隻移動一條邊的位置。

一棵樹最多有兩個重心,且相鄰。

求法

先任意取乙個點作為根,在這棵樹上求出每乙個子樹的大小,對每個結點求它的各個子樹的最大大小,若 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 把兩個樹通過一條邊相連得到乙個新的樹,那麼新...