Submission #49590

#TimeUsernameProblemLanguageResultExecution timeMemory
49590rzbtNetwork (BOI15_net)C++14
100 / 100
922 ms153276 KiB
#include <bits/stdc++.h>
using namespace std;

int n,in1,in2,tren,prethodni,duz,koren=0;
vector<vector<int> > drvo;
stack<pair<int,int> > dfs;
pair<int,int> vrh;
vector<int> listovi;

int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    drvo.resize(n+1);
    for(int i=1;i<n;i++)
    {
        cin>>in1>>in2;
        drvo[in1].push_back(in2);
        drvo[in2].push_back(in1);
    }
    if(n<=20)
    {
        if(n==1)
        {
            cout<<1<<endl<<1<<" "<<1;
        }
        if(n==2)
        {
            cout<<1<<endl<<1<<" "<<2;
            return 0;
        }
        for(int i=1;i<=n;i++)
        {
            if(drvo[i].size()>1)
            {
                dfs.push(make_pair(i,0));
                break;
            }
        }
        while(!dfs.empty())
        {
            vrh=dfs.top();
            dfs.pop();
            tren=vrh.first;
            prethodni=vrh.second;
            duz=drvo[tren].size();
            if(duz==1)
            {
                listovi.push_back(tren);
            }
            else
            {
                for(int i=0;i<duz;i++)
                {
                    if(drvo[tren][i]!=prethodni)
                    {
                        dfs.push(make_pair(drvo[tren][i],tren));
                    }
                }
            }
        }
        duz=listovi.size();
        cout<<(duz+1)/2<<endl;
        for(int i=0;i<(duz+1)/2;i++)
        {
            if(i==duz-i-1)
            {
                cout<<listovi[0]<<" "<<listovi[i]<<endl;
            }
            else
            {
                cout<<listovi[i]<<" "<<listovi[i+(duz+1)/2]<<endl;
            }
        }
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        if(drvo[i].size()>1)
        {
            dfs.push(make_pair(i,0));
            break;
        }
    }
    while(!dfs.empty())
    {
        vrh=dfs.top();
        dfs.pop();
        tren=vrh.first;
        prethodni=vrh.second;
        duz=drvo[tren].size();
        if(duz==1)
        {
            listovi.push_back(tren);
        }
        else
        {
            for(int i=0;i<duz;i++)
            {
                if(drvo[tren][i]!=prethodni)
                {
                    dfs.push(make_pair(drvo[tren][i],tren));
                }
            }
        }
    }
    duz=listovi.size();
    cout<<(duz+1)/2<<endl;
    for(int i=0;i<(duz+1)/2;i++)
    {
        if(i==duz-i-1)
        {
            cout<<listovi[0]<<" "<<listovi[i]<<endl;
        }
        else
        {
            cout<<listovi[i]<<" "<<listovi[(duz+1)/2+i]<<endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...