include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
const int N = 100010;
bool state[N]; // 标记节点是否被访问
int n, ans = N; // 节点数和重心
struct Node {
int id; // 节点编号
int w; // 权值(如果需要)
Node* next; // 指向下一个节点
Node(int _id, int _w) : id(_id), w(_w), next(nullptr) {}
};
Node* head[N]; // 邻接表的头指针数组
void add(int a, int b) {
Node* node = new Node(b, 0); // 创建新节点
node->next = head[a]; // 将新节点插入到链表头
head[a] = node;
node = new Node(a, 0); // 反向边
node->next = head[b];
head[b] = node;
}
int dfs(int u) {
state[u] = true;
int size = 0, sum = 1; // size: 最大子树大小, sum: 当前节点的子树大小
for (Node* v = head[u]; v != nullptr; v = v->next) {
int j = v->id; // 获取相邻节点编号
if (state[j]) continue;
int s = dfs(j); // 递归 DFS
size = max(size, s); // 更新最大子树大小
sum += s; // 更新当前子树的大小
}
size = max(size, n - sum); // 更新去掉当前节点后的最大子树大小
ans = min(size, ans); // 更新全局最小值
return sum; // 返回当前子树大小
}
int main() {
cin >> n;
memset(head, 0, sizeof(head)); // 初始化头指针数组
int a, b;
for (int i = 0; i < n - 1; i++) { // 树有 n-1 条边
cin >> a >> b;
add(a, b);
}
dfs(1); // 从任意节点开始 DFS
cout << ans; // 输出重心
return 0;
}