제출 #1274647

#제출 시각아이디문제언어결과실행 시간메모리
1274647beheshtNetwork (BOI15_net)C++20
100 / 100
645 ms98068 KiB
#include <bits/stdc++.h>
 
#define d1(x)                cout << #x << " : " << x << endl << flush
#define d2(x, y)             cout << #x << " : " << x << "   " << #y << " : " << y << endl << flush
#define d3(x, y, z)          cout << #x << " : " << x << "   " << #y << " : " << y << "   " << #z << " : " << z << endl << flush
#define d4(x, y, z, a)       cout << #x << " : " << x << "   " << #y << " : " << y << "   " << #z << " : " << z << "    "<< #a << " : " << a << endl << flush
#define arr(x)               array <ll, x>
#define ld                   long double
#define ll                   long long
#define int                  long long
#define pb                   push_back
#define endl                 '\n'
#define lc                   v << 1
#define rc                   v << 1 | 1
 
using namespace std;
 
const int INF = 1e9 + 24 + (34 / 10); // 34 ---> 35
const int MAXN = 5e5 + 24 + (34 / 10); // 34 ---> 35
 
vector <int> adj[MAXN];
vector <arr(2)> ans;
int r;
 
bool cmp(vector <int> a, vector <int> b){
	return a.size() > b.size();
}
 
void merge(vector <vector <int>> a){
 
	while(!a.empty() && (a.back()).empty())
		a.pop_back();
 
	int n = a.size();
 
	// for(auto x : a){
	// 	for(auto v : x)
	// 		cout << v + 1 << " ";
	// 	cout << endl;
	// }
	// cout << endl;
	
	for(int i = 0; i < 2 * n; i += 2){
 
		int x = i % n, y = (i + 1) % n;
 
		if(a[x].empty() || a[y].empty()){
			i--;
			continue;
		}
 
		ans.pb({a[x].back(), a[y].back()});
		a[x].pop_back();
		a[y].pop_back();
	}
}
 
vector <int> dfs(int u, int p){
 
	vector <vector <int>> child;
	vector <int> res;
	
	if(u != r && adj[u].size() == 1){
		res.pb(u);
		return res;
	}
 
	int cnt = 0;
 
	for(auto v : adj[u]){
		if(v != p){
			child.pb(dfs(v, u));
			cnt += (child.back()).size();
		}
	}
 
	// d1(u + 1);
 
	// for(auto x : child){
	// 	for(auto v : x)
	// 		cout << v + 1 << " ";
		
	// 	cout << endl;
	// }
 
	sort(child.begin(), child.end(), cmp);
 
	if(cnt & 1){
		res.pb((child[0]).back());
		(child[0]).pop_back();
	}
 
	else if(child.size() == 1){
		res = child.back();
		child.pop_back();
	}
 
	else{
		res.pb((child[0]).back());
		res.pb((child[1]).back());
 
		(child[0]).pop_back();
		(child[1]).pop_back();
	}
 
	// d1(u + 1);
	// for(auto v : res)
	// 	cout << v + 1 << " ";
	// cout << endl;
 
	sort(child.begin(), child.end(), cmp);
	merge(child);
 
	return res;
}
 
signed main(){
	
	ios_base::sync_with_stdio(0);
	cin.tie(0);
 
	int n;
	cin >> n;
 
	for(int i = 1; i < n; i++){
		int u, v;
		cin >> u >> v;
 
		u--;
		v--;
 
		adj[u].pb(v);
		adj[v].pb(u);
	}
 
	for(int i = 0; i < n; i++)
		if(adj[i].size() > 1)
			r = i;
 
	vector <int> eli = dfs(r, r);
 
	// d1(r);
	if(eli.size() == 1){
 
		if(r != adj[eli[0]][0])
			ans.pb({r, eli[0]});
		
		else{
			for(auto v : adj[r])
				if(v != eli[0] && v != adj[eli[0]][0]){
					ans.pb({eli[0], v});
					break;
				}
		}
	}
 
	else 
		ans.pb({eli[0], eli[1]});
 
	cout << ans.size() << endl;
 
	for(auto [u, v] : ans)
		cout << u + 1 << " " << v + 1 << endl;
}
 
// Ey To Bahane! :_)))
 
// -------------<3------------- //
/*
Magasan dor shirini: 
 
1. MAXN
2. Input style
3. index or value? Masale In Ast!	
4. MOD 
 
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...