树上简单问题->树的重心

没有题目链接,上个代码,是为了求解树的重心数量以及节点编号

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];
    }
}
posted @ 2024-01-12 09:48  _Yxc  阅读(15)  评论(0)    收藏  举报