제출 #534523

#제출 시각아이디문제언어결과실행 시간메모리
534523Yazan_AlattarNetwork (BOI15_net)C++14
0 / 100
6 ms11980 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define F first
#define S second
#define pb push_back
#define endl "\n"
#define all(x) x.begin(), x.end()
const int M = 500007;
const ll inf = 1e18;
const ll mod = 1e9+7;
const double pi = acos(-1);
const int dx[] = {0, -1, 0, 1}, dy[] = {1, 0, -1, 0};
const int block = 320;

int n;
vector <int> v, adj[M];
vector < pair <int,int> > ans;
void dfs(int node, int p, int src){
	vector <int> cur;
	for(auto i : adj[node]) if(i != p && adj[i].size() > 1) {
		dfs(i, node, src);
		if(node == src){
			if(cur.size()){
				ans.pb({cur.back(), v.back()});
				cur.pop_back();
				v.pop_back();
			}
			for(auto j : v) cur.pb(j);
			v.clear();
		}
	}
	
	for(auto i : adj[node]) if(i != p && adj[i].size() == 1) {
		dfs(i, node, src);
		if(node == src){
			if(cur.size()){
				ans.pb({cur.back(), v.back()});
				cur.pop_back();
				v.pop_back();
			}
			for(auto j : v) cur.pb(j);
			v.clear();
		}
	}
	
	if(src == node){
		for(int i = 0; i < (int)cur.size() - 1; i += 2) ans.pb({cur[i], cur[i + 1]});
		if(cur.size() % 2) ans.pb({cur.back(), src});
	}
	
	if(adj[node].size() == 1) v.pb(node);
	return;
}

int main(){
	cin >> n;
	for(int i = 1; i < n; ++i){
		int a, b;
		cin >> a >> b;
		adj[a].pb(b);
		adj[b].pb(a);
	}
	for(int i = 1; i <= n; ++i) if(adj[i].size() > 1) {dfs(i, 0, i); break;}
	
	cout << ans.size() << endl;
	for(auto i : ans) cout << i.F << " " << i.S << endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...