給一棵樹,找出樹重心(若以該點為根,所有不含根節點的子樹中點數最大的那個數量要最小)。
$N\le 10^6$
考慮樹dp,紀錄每個子樹的大小,該點的答案即為$max(\text{所有不含自己的子樹大小}, N-\text{當前子樹大小})$。
當前子樹大小即為所有不含自己子樹的大小+1(自己),將這個值回傳即可。
\Lambda大法好/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
#include <bits/stdc++.h> using namespace std;
#define EmiliaMyWife ios::sync_with_stdio(0); cin.tie(NULL);
signed main() { EmiliaMyWife
int n; cin >> n; vector<vector<int>> edge(n); vector<int> ans(n); for(int i = 1, a, b; i < n; i++) cin >> a >> b, edge[a].push_back(b), edge[b].push_back(a); const function<int(int, int)> dfs = [&](int v, int p) { int res = 1; for(int u : edge[v]) { if(u == p) continue; int w = dfs(u, v); ans[v] = max(ans[v], w); res += w; } ans[v] = max(ans[v], n - res); return res; }; dfs(0, 0); cout << *min_element(ans.begin(), ans.end()) << '\n';
return 0; }
|