思路:
整体框架为树的dfs,每次在二叉树中模拟删除一个节点,会把树划分成3部分,如下图
我们的目的是让划分出的最大部分最小。
那么如何得到这三个部分的节点数量,如图在k点进行dfs,通过邻接矩阵在k点的左孩子和右孩子分别进行dfs,然后(n-B-C)就是A的节点数量
#include <bits/stdc++.h>
using namespace std;
int head[200005], nxt[200005], edge[200005], idx = 0, n, ans = 200000;
bool vis[200005];
void add(int s, int d)
{
edge[idx] = d;
nxt[idx] = head[s];
head[s] = idx++;
}
int dfs(int x)
{
int res = 0;
vis[x] = true;
int sum = 1;
for (int i = head[x]; i != -1; i = nxt[i])
{
int des = edge[i];
if (!vis[des])
{
int cnt = dfs(des);
res = max(cnt, res);
sum += cnt;
}
}
res = max(res, n - sum);
ans = min(ans, res);
return sum;
}
int main()
{
cin >> n;
memset(head, -1, sizeof head);
for (int i = 0; i < n - 1; i++)
{
int a, b;
cin >> a >> b;
add(a, b);
add(b, a);
}
dfs(1);
cout << ans;
return 0;
}