#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=5e5+10;
vector<int> ma[N];
int par[N],hei[N];
bool path[N],isleaf[N];
// vector<int> cur;
vector<pair<int,int>> ans;
vector<int> leafs[N];
int mx=-1,end_point=-1;
void dfs(int x,int p=-1,int h=1)
{
    bool leaf=1;
    par[x]=p;
    hei[x]=h;
    for(auto y:ma[x])
    {
        if(y==p)continue;
        leaf=0;
        dfs(y,x,h+1);
    }
    if(leaf)
    {
        isleaf[x]=1;
        leafs[x].push_back(x);
        if(h>mx)
        {
            mx=h;
            end_point=x;
        }
    }
}
// void dfs_(int x,int p=-1,int h=1)
// {
//     for(auto y:ma[x])
//     {
//         if(y==p or path[y])continue;
//         dfs_(y,x,h+1);
//     }
//     if(isleaf[x])
//     {
//         leafs.push_back(x);
//     }
// }
int main()
{
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        ma[x].push_back(y);
        ma[y].push_back(x);
    }
    for(int i=1;i<=n;i++)
    {
        if(ma[i].size()==1)
        {
            leafs[i].push_back(i);
            dfs(i);
            break;
        }
    }
    vector<pair<int,int>> ord;
    for(int i=1;i<=n;i++)
    {
        ord.push_back({hei[i],i});
    }
    sort(rbegin(ord),rend(ord));
    // for(int e=end_point;e!=-1;e=par[e])
    // {
    //     path[e]=1;
    // }
    // for(int i=0;i<n;i++)
    // {
    for(auto jtp:ord) // order by height
    {
        int j=jtp.second;
        if(leafs[j].size()==0 or par[j]==-1)continue;
        // j -> par[j]
        while(leafs[j].size()>0 and leafs[par[j]].size()>0 and leafs[j].size()+leafs[par[j]].size()>=3)
        {
            int x=leafs[j].back();
            int y=leafs[par[j]].back();
            leafs[j].pop_back();
            leafs[par[j]].pop_back();
            ans.push_back({x,y});
        }
        while(leafs[j].size())
        {
            leafs[par[j]].push_back(leafs[j].back());
            leafs[j].pop_back();
        }
    }
    for(int i=1;i<=n;i++)
    {
        // cout<<"Leafs at "<<i<<endl;
        // for(auto j:leafs[i])cout<<j<<' ';
        // cout<<endl;
        if(leafs[i].size())
        {
            ans.push_back({leafs[i].back(),i});
        }
        // cout<<leafs[i].size()<<' ';
    }
    // cout<<endl;
    // i
    // }
    
    cout<<ans.size()<<endl;
    for(auto i:ans)
    {
        cout<<i.first<<' '<<i.second<<endl;
    }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |