树上简单问题->树的重心
没有题目链接,上个代码,是为了求解树的重心数量以及节点编号
void solve(){
int n;
cin >> n;
vector<vector<int>> al(n + 1);
for (int i = 1; i < n; ++i){
int u, v;
cin >> u >> v;
al[u].emplace_back(v);
al[v].emplace_back(u);
}
vector<int> sz(n + 1, 1);
vector<int> ans;
function<void(int, int)> dfs = [&](int u, int p){
int maxn = 0;
for (auto& v : al[u]){
if (v != p){
dfs(v, u);
sz[u] += sz[v];
maxn = max(maxn, sz[v]);
}
}
maxn = max(maxn, n - sz[u]);
if (!ans.empty() && maxn < sz[ans.back()]){
ans.clear();
ans.emplace_back(u);
}
else if (ans.empty() || sz[ans.back()] == maxn){
ans.emplace_back(u);
}
};
dfs(1, 0);
for (int i = 0; i < int(ans.size()); ++i){
cout << ans[i] << " \n"[i == int(ans.size()) - 1];
}
}

浙公网安备 33010602011771号