poj1655 樹的重心 樹形dp

2022-03-11 00:38:20 字數 885 閱讀 3330

樹的重心定義為:找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡.

處理處每個節點的孩子有幾個,和樹的大小就好了。

#include#include

#include

#include

#include

#define inf 99999999

using

namespace

std;

const

int maxn = 20010

;struct

node

edge[maxn*2

];int

p,len;

intnum[maxn];

intvis[maxn],pre[maxn],ind,n;

int siz[maxn];//

the size of the tree

int h[maxn];//

the maxnum of subtree

intway;

void add(int x,int

y)void dfs1(int

rt) }

}int

main()

memset(vis,

0,sizeof

(vis));

memset(siz,

0,sizeof

(siz));

memset(h,

0,sizeof

(h));

dfs1(1);

int ans =inf;

intf;

for(i=1; i<=n; i++)

}//cout"}

}

POJ 1655 樹的重心(樹形 DP)

balancing act 定義乙個點的 平衡 值等於將這個點拆去後,形成的子樹中節點數的最大值。求一棵樹 平衡 值最小的點。這其實就是樹的重心的概念,通過樹形 dp 很容易解決。當去掉抹一點後,它下面的子樹的節點個數通過 dfs 可以得到,它上面的子樹的節點個數等於總節點個數減去它本身及其子節點的...

POJ 1655 求樹的重心 樹形dp

題目鏈結 樹的重心 若樹上的乙個節點滿足其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心。1.任選乙個點為根,只要統計出每個點的子樹大小,就能很快求出每個點子樹節點的數量的最大值。2.求每個點子樹的大小同樣只需要自底向上的更新資訊。3.記sz u 為子樹u節點的數量 包括 u 本身 4...

poj1655樹的重心

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