#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
#define dd(x) cout<<#x<<" is "<<x<<endl;
#define dd2(x,y) cout<<#x<<" is "<<x<<' '<<#y<<" is "<<y<<endl;
typedef pair<int,int> pii;
const int N = 5e5+5;
vector<int>adj[N], v[N];
int sz[N];
void dfs(int x, int p){
if(adj[x].size() == 1) sz[x] = 1;
else sz[x] = 0;
for(auto i:adj[x]){
if(i==p) continue;
dfs(i,x);
sz[x] += sz[i];
}
}
int findc(int x, int p, int n){
int centriod = x;
for(auto i:adj[x]){
if(i==p) continue;
if(sz[i] > n/2){
centriod = findc(i,x,n);
}
}
return centriod;
}
void dfs2(int x, int p, int h){
if(adj[x].size() == 1) v[h].pb(x);
for(auto i:adj[x]){
if(i==p) continue;
dfs2(i,x,h);
}
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0);
int n; cin>>n;
for(int i=0; i<n-1; i++){
int a,b; cin>>a>>b;
adj[a].pb(b);
adj[b].pb(a);
}
dfs(1,-1);
int cn = findc(1,-1,sz[1]);
dfs(cn,-1);
priority_queue<pii>pq;
for(auto i:adj[cn]){
dfs2(i,cn,i);
pq.push({v[i].size(), i});
}
cout<<(sz[cn]+1)/2<<'\n';
while(pq.size() > 1){
auto[a,b] = pq.top(); pq.pop();
auto[c,d] = pq.top(); pq.pop();
cout<<v[b].back()<<' '<<v[d].back()<<'\n';
v[b].pop_back();
v[d].pop_back();
if(a-1) pq.push({a-1,b});
if(c-1) pq.push({c-1,d});
}
if(pq.size()){
auto[a,b] = pq.top(); pq.pop();
cout<<v[b].back()<<' '<<cn<<'\n';
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |