采用邻接表存储,先把边存下来,再把每个边可以达到的点存在边后面,因为是无向图,听y总的,会得到两个关键点,一个是dfs可以统计出以某个节点,一个是题目的结果出现在1.该树减去重心节点为根树的节点树2.以删除节点为根的子树中,根据分析编写代码即可
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>> map;
vector<int> child;
int n;
int ret = 1e9;
void dfs(int i, int parent) {
child[i] = 1;
int deletemax = 0;
for (auto t : map[i]) {
if (t != parent) {
dfs(t, i);
child[i] += child[t];
deletemax = max(deletemax, child[t]);
}
}
deletemax = max(deletemax, n - child[i]);
if (deletemax < ret) {
ret = deletemax;
}
}
int main() {
cin >> n;
map = vector<vector<int>>(n);
child = vector<int>(n);
for (int i = 0; i < n - 1; i++) {
int a, b;
cin >> a >> b;
a--;
b--;
map[a].push_back(b);
map[b].push_back(a);
}
dfs(0, -1);
cout << ret;
return 0;
}