Submission #1173361

#TimeUsernameProblemLanguageResultExecution timeMemory
1173361NurislamNetwork (BOI15_net)C++20
100 / 100
247 ms97792 KiB
#include <bits/stdc++.h>

using namespace std;


#define int long long
//#define pb push_back

int inf = 1e18; 

const int mod = 1e9 + 7;
const int N = 1e5 + 5;


void solve(){
	int n;
	cin >> n;
	vector<vector<int>> g(n+1);
	for(int i = 1; i < n; i ++ ) {
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	
	int root = 1;
	while(g[root].size() == 1) root ++ ;
	
	
	vector<array<int,2>> ans;
	function<vector<int>(int,int)> dfs = [&] (int ps, int pr){
		if(g[ps].size() == 1) {
			vector<int> res = {ps};
			return res;
		};
		
		
		vector<int> cur;
		for(int to : g[ps]) 
			if(to != pr){
				vector<int> res = dfs(to, ps);
				if(cur.size() == 0) cur = res;
				else {
					if(cur.size() < res.size())swap(cur, res);
					
					while(cur.size() > 1 && res.size()) {
						ans.push_back({res.back(), cur.back()});
						cur.pop_back();
						res.pop_back();
					}
					for(int i:res)cur.push_back(i);
				}
			}
			
		//cout << ":" << ps << '\n';
		//for(auto i : cur)cout << i << ' ';
		//cout << '\n';
		return cur;
	};
	
	vector<int> res = dfs(root, root);
	
	for(int i = 1; i < res.size(); i += 2)
		ans.push_back({res[i], res[i-1]});
		
		
	if(res.size()%2 == 1) 
		ans.push_back({res.back(), ans.back()[1]});
	
	
	cout << ans.size() << '\n';
	for(auto [a, b] : ans)cout << a << ' ' << b << '\n';
	
};



signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	int tt = 1;
	//cin >> tt;
	
	while(tt -- ){
		solve();
	};
	
};
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...