Submission #1346667

#TimeUsernameProblemLanguageResultExecution timeMemory
1346667killerzaluuNetwork (BOI15_net)C++20
100 / 100
215 ms49328 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 500000 + 5;

int n;
vector<int> g[MAXN];
int parent_[MAXN];
int leafcnt[MAXN];
vector<int> leaves;
vector<pair<int,int>> ans;

void dfs_cnt(int u, int p) {
    parent_[u] = p;
    if ((int)g[u].size() == 1 && p != 0) {
        leafcnt[u] = 1;
        return;
    }
    leafcnt[u] = 0;
    for (int v : g[u]) {
        if (v == p) continue;
        dfs_cnt(v, u);
        leafcnt[u] += leafcnt[v];
    }
}

void dfs_leaves(int u, int p, int root) {
    if ((int)g[u].size() == 1 && u != root) {
        leaves.push_back(u);
        return;
    }
    for (int v : g[u]) {
        if (v == p) continue;
        dfs_leaves(v, u, root);
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    for (int i = 1; i <= n - 1; i++) {
        int a, b;
        cin >> a >> b;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    if (n == 2) {
        cout << 1 << '\n';
        cout << 1 << ' ' << 2 << '\n';
        return 0;
    }

    dfs_cnt(1, 0);
    int totalLeaves = leafcnt[1];

    int c = 1;
    while (true) {
        int nxt = -1;
        for (int v : g[c]) {
            if (v == parent_[c]) continue;
            if (leafcnt[v] > totalLeaves / 2) {
                nxt = v;
                break;
            }
        }
        if (nxt == -1) break;
        c = nxt;
    }

    for (int v : g[c]) {
        dfs_leaves(v, c, c);
    }

    int m = (int)leaves.size();
    int k = m / 2;

    for (int i = 0; i < k; i++) {
        ans.push_back({leaves[i], leaves[i + k]});
    }

    if (m % 2 == 1) {
        ans.push_back({leaves[m - 1], leaves[0]});
    }

    cout << ans.size() << '\n';
    for (auto [u, v] : ans) {
        cout << u << ' ' << v << '\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...