題目鏈結
樹的重心:
若樹上的乙個節點滿足其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心。
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 ...