树的重心
作者:
Nocturne49
,
2024-03-18 13:40:46
,
所有人可见
,
阅读 17
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10; // 根据题目的数据范围,预设最大节点数
int n; // 树的节点数
vector<int> G[N]; // 存储树的邻接表
int sz[N]; // 存储以每个节点为根的子树的大小
bool vis[N]; // 标记数组,用于DFS
int ans = N, maxPart = N; // ans用于存储重心的节点编号,maxPart存储删除重心后的最大连通块大小
// DFS函数,计算以节点u为根的子树大小
void dfs(int u) {
vis[u] = true; // 标记节点u已访问
sz[u] = 1; // 初始化当前节点的子树大小为1
int maxSub = 0; // 存储除当前节点外,最大的子树大小
for (int v : G[u]) { // 遍历节点u的邻居节点
if (!vis[v]) { // 如果邻居节点未被访问过
dfs(v); // 递归调用DFS函数
sz[u] += sz[v]; // 更新节点u的子树大小
maxSub = max(maxSub, sz[v]); // 更新最大的子树大小
}
}
maxSub = max(maxSub, n - sz[u]); // 检查除当前节点的子树外的其他部分大小
if (maxSub < maxPart) { // 如果当前节点的最大子树大小小于最大连通块大小
maxPart = maxSub; // 更新最大连通块大小
ans = u; // 更新重心的节点编号
}
}
int main() {
cin >> n; // 输入树的节点数
for (int i = 1; i < n; i++) { // 构建树的邻接表
int a, b;
cin >> a >> b;
G[a].push_back(b); // 节点a与节点b相连
G[b].push_back(a); // 节点b与节点a相连
}
dfs(1); // 从节点1开始DFS
cout << maxPart << endl; // 输出结果
return 0;
}