Submission #1173719

#TimeUsernameProblemLanguageResultExecution timeMemory
1173719ThommyDBNetwork (BOI15_net)C++20
0 / 100
0 ms328 KiB
#include<bits/stdc++.h>

using namespace std;

int n;
vector<vector<int>> adj, rootAdjLeafs;

int rootAdj = 0;
int dfs(int x, int prev){
    if(adj[x].size()==1){
        //cout << "x: "<< x+1<<"\n";
        rootAdjLeafs[rootAdj].push_back(x);
        return 1;
    }

    int cnt = 0;
    for(auto u : adj[x]){
        if(u==prev)continue;
        //cout << "for " << x+1 << ": " << u+1 << "\n";
        cnt+=dfs(u, x);
    }
    return cnt;
}

signed main(){
    cin >> n;
    adj.resize(n);
    int root = 0;
    for(int i = 0; i < n-1; i++){
        int u, v;
        cin >> u >> v; u--; v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
        if(adj[u].size()>adj[root].size()){
            root = u;
        }
        if(adj[v].size()>adj[root].size()){
            root = v;
        }
    }
    rootAdjLeafs.resize(adj[root].size());
    for(int i = 0; i < adj[root].size(); i++){
        //cout << "begin: " << adj[root][i] << "\n";
        rootAdj = i;
        dfs(adj[root][i], root);
    }
    /*cout << "root: " << root << "\n";
    for(int i = 0; i < rootAdjLeafs.size(); i++){
        cout << "leaf size: " << rootAdjLeafs[i].size() << "\n";
    }*/
    vector<pair<int, int>> ans;
    for(int i = 0; i < rootAdjLeafs.size()-1; i++){
        for(int j = rootAdjLeafs[i].size()-1; j >= 0; j--){
            int largestSize = i+1;
            for(int k = i+2; k < rootAdjLeafs.size(); k++){
                if(rootAdjLeafs[k].size() > rootAdjLeafs[largestSize].size()){
                    largestSize = k;
                }
            }
            if(rootAdjLeafs[largestSize].size()==0){
                ans.push_back({rootAdjLeafs[i][j], root});
            }
            else{
                ans.push_back({rootAdjLeafs[i][j], rootAdjLeafs[largestSize].back()});
                rootAdjLeafs[largestSize].pop_back();
            }
            rootAdjLeafs[i].pop_back();
        }
    }
    for(int i = 0; i < rootAdjLeafs.back().size(); i++){
        ans.push_back({rootAdjLeafs.back()[i], root});
    }
    cout << ans.size() << "\n";
    for(auto u : ans){
        cout << u.first+1 << " " << u.second+1 << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...