給一棵樹,找出樹重心(若以該點為根,所有不含根節點的子樹中點數最大的那個數量要最小)。
$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; }
 
  |