Balancing Act
题意
找一个树的重心,模板。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1e6 + 10;
int n, N;
int vis[maxn];
int v[maxn];
int dp[maxn];
int dp2[maxn];
vector<int> tree[maxn];
void dfs(int root) {
if (vis[root]) {
return;
}
vis[root] = 1;
for (int i = 0; i < tree[root].size(); i++) {
if (tree[root][i] != root && !vis[tree[root][i]]) {
dfs(tree[root][i]);
dp2[root] += dp2[tree[root][i]];
dp[root] = max(dp[root], dp2[tree[root][i]]);
}
}
dp2[root]++;
dp[root] = max(dp[root], n - dp2[root]);
}
int main() {
while (scanf("%d", &N) != EOF) {
while (N--) {
scanf("%d", &n);
memset(vis, 0, sizeof(vis));
memset(v, 0, sizeof(v));
memset(dp, 0, sizeof(dp));
memset(dp2, 0, sizeof(dp2));
for (int i = 0; i <= n; i++) {
tree[i].clear();
}
int start, end;
for (int i = 0; i < n - 1; ++i) {
scanf("%d%d", &start, &end);
tree[start].push_back(end);
tree[end].push_back(start);
}
dfs(1);
int minn = dp[1];
int id = 1;
for (int i = 1; i <= n; i++) {
if (minn > dp[i]) {
minn = dp[i];
id = i;
}
}
printf("%d %d\n", id, minn);
}
}
return 0;
}