【模板】树的重心
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+10; const int inf = 0x3f3f3f3f; struct edge{ int to, nxt; }e[maxn << 1]; int head[maxn], cnt; int n, ans = inf; void add(int a,int b){ e[++cnt].to = b; e[cnt].nxt = head[a]; head[a] = cnt; } int st[maxn]; int dfs(int u) { st[u] = 1; int sum = 1, res = 0; for(int i = head[u]; i; i = e[i].nxt) { if(!st[e[i].to]) { int s = dfs(e[i].to); sum += s; res = max(res, s); } } res = max(res, n-sum); ans = min(ans,res); return sum; } int main() { cin >> n; for(int i = 0; i < n-1; i++){ int a, b; cin >> a >> b; add(a, b); add(b, a); } dfs(1); cout << ans << endl; return 0; }
注意 res是最大连通块中的个数

浙公网安备 33010602011771号