Submission #108707

#TimeUsernameProblemLanguageResultExecution timeMemory
108707MAMBANetwork (BOI15_net)C++17
100 / 100
769 ms80720 KiB
#include <bits/stdc++.h> 

using namespace std;

#define rep(i , j , k) for (int i = j; i < k; i++)
#define pb push_back
#define for_all(x) x.begin(),x.end()

typedef long long ll;
typedef pair<int , int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

inline void fileIO(string s) {
	freopen((s + ".in").c_str(), "r", stdin);
	freopen((s + ".out").c_str(), "w", stdout);
}

template<class T , class S>
inline void smin(T &a, S b) {
	if (a > b)
		a = b;
}

template<class T , class S>
inline void smax(T &a, S b) {
	if (a < b)
		a = b;
}

constexpr int N = 1e6 + 10;

int n;
vi adj[N];
vector<pii> res;
pii dp[N];

void dfs(int v, int par = 0) {
	vi st;
	if (adj[v].size() == 1) {
		dp[v] = {v , -1};
		return;
	}
	for (auto e : adj[v])
		if (e ^ par) {
			dfs(e, v);
			if (st.size() > 1) {
				res.pb({st.back() , dp[e].first});
				st.pop_back();
				dp[e].first = -1;
			}
			if (st.size() > 1 && dp[e].second != -1) {
				res.pb({st.back() , dp[e].second});
				st.pop_back();
				dp[e].second = -1;
			}
			if (dp[e].first != -1)
				st.pb(dp[e].first);
			if (dp[e].second != -1)
				st.pb(dp[e].second);
		}
	if (st.size() == 3) {
		res.pb({st[0] , st[1]});
		int me = st.back();
		st.clear();
		st.pb(me);
	}
	dp[v].first = st.back();
	st.pop_back();
	dp[v].second = st.empty() ? -1 : st.back();

}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> n;
	rep(i , 1 , n) {
		int u , v;
		cin >> u >> v;
		adj[u].pb(v);
		adj[v].pb(u);
	}

	rep(i , 1 , n + 1)
		if (adj[i].size() > 1) {
			dfs(i);
			if (dp[i].first != -1 && dp[i].second != -1) 
				res.pb(dp[i]);
			else
				res.pb({dp[i].first , i});
			break;
		}

	cout << res.size() << endl;
	for (auto e : res)
		cout <<e.first << ' ' << e.second << '\n';


	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...