Submission #1163782

#TimeUsernameProblemLanguageResultExecution timeMemory
1163782AlgorithmWarriorNetwork (BOI15_net)C++20
100 / 100
394 ms105628 KiB
#include <bits/stdc++.h>
#define pii pair<int,int>

using namespace std;

int const MAX=5e5+5;
int n;
vector<int>tree[MAX];
vector<pii>rasp;
int root;

void read(){
    cin>>n;
    int i;
    for(i=1;i<n;++i){
        int u,v;
        cin>>u>>v;
        tree[u].push_back(v);
        tree[v].push_back(u);
    }
}

pii dfs(int nod,int tata){
    if(tree[nod].size()==1)
        return {nod,0};
    vector<int>solo;
    vector<pii>duo;
    for(auto fiu : tree[nod])
        if(fiu!=tata){
            auto per=dfs(fiu,nod);
            if(per.second==0)
                solo.push_back(per.first);
            else
                duo.push_back(per);
        }
    int i;
    if(duo.size()>1){
        for(i=0;i<(int)duo.size()-1;++i)
            rasp.push_back({duo[i].second,duo[i+1].first});
        rasp.push_back({duo[0].first,duo.back().second});
        duo.clear();
    }
    if(duo.size()==1){
        if(solo.size()==1){
            swap(solo[0],duo[0].first);
            rasp.push_back(duo[0]);
            duo.clear();
        }
        else
        if(solo.size()>1){
            rasp.push_back({duo[0].second,solo.back()});
            solo.pop_back();
            rasp.push_back({duo[0].first,solo.back()});
            solo.pop_back();
            duo.clear();
        }
    }
    while(solo.size()>=2){
        int nod1=solo.back();
        solo.pop_back();
        int nod2=solo.back();
        solo.pop_back();
        rasp.push_back({nod1,nod2});
    }
    if(nod==root){
        if(solo.size()==1){
            rasp.push_back({solo[0],root});
            solo.clear();
        }
        return {0,0};
    }
    else{
        if(solo.size()==1)
            return {solo[0],0};
        if(duo.size()==1)
            return duo[0];
        auto per=rasp.back();
        rasp.pop_back();
        return per;
    }
}

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

void find_root(){
    int i;
    for(i=1;i<=n;++i)
        if(tree[i].size()>1)
            root=i;
}

int main()
{
    read();
    find_root();
    dfs(root,0);
    write();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...