POJ 1655 求樹的重心 樹形dp

2021-10-06 10:01:10 字數 2398 閱讀 8745

題目鏈結

樹的重心:

若樹上的乙個節點滿足其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心。

1.任選乙個點為根,只要統計出每個點的子樹大小,就能很快求出每個點子樹節點的數量的最大值。

2.求每個點子樹的大小同樣只需要自底向上的更新資訊。

3.記sz[u]為子樹u節點的數量(包括 u 本身)

4.sz[u] = 1 + 所有子節點v的sz之和

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define eb emplace_back

#define mp make_pair

#define mt make_tuple

#define fi first

#define se second

#define pb push_back

#define all(x) (x).begin(), (x).end()

#define rall(x) (x).rbegin(), (x).rend()

#define forn(i, n) for (int i = 0; i < (int)(n); ++i)

#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)

#define ford(i, a, b) for (int i = (int)(a); i >= (int)b; --i)

#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)

#define rep(i, l, r) for (int i = (l); i <= (r); i++)

#define per(i, r, l) for (int i = (r); i >= (l); i--)

#define ms(x, y) memset(x, y, sizeof(x))

#define sz(x) ((int)(x).size())

using

namespace std;

typedef pair<

int,

int> pii;

typedef vector<

int> vi;

typedef vector vpi;

typedef vector vvi;

typedef

long

long i64;

typedef vector vi64;

typedef vector vvi64;

typedef pair pi64;

typedef

double ld;

template

<

class

t>

bool

uin(t &a, t b)

template

<

class

t>

bool

uax(t &a, t b)

const

int maxn =

20000

+100

;int tc, n, sz[maxn]

, fa[maxn]

, res[maxn]

;vector<

int> g[maxn]

;void

init

(int n)

void

dfs1

(int x,

int par)

}int

main()

dfs1(1

,0);

for(

int i =

1; i <= n;

++i)

res[i]

= maxx;

}int ans = int_max, node;

for(

int i =

1; i <= n;

++i)

}printf

("%d %d\n"

, node, ans);}

#ifdef local_define

cerr <<

"time elapsed: "

<<

1.0*

clock()

/ clocks_per_sec <<

" s.\n"

;#endif

return0;

}

POJ 1655 樹的重心(樹形 DP)

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

poj1655 樹的重心 樹形dp

樹的重心定義為 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡.處理處每個節點的孩子有幾個,和樹的大小就好了。include include include include include define inf 99999999 usi...

poj1655樹的重心

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