제출 #390058

#제출 시각아이디문제언어결과실행 시간메모리
390058BTheroNetwork (BOI15_net)C++17
100 / 100
688 ms58172 KiB
// chrono::system_clock::now().time_since_epoch().count() #include <bits/stdc++.h> #define pb push_back #define eb emplace_back #define mp make_pair #define fi first #define se second #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() #define rep(i, a, b) for (int i = (a); i < (b); ++i) #define debug(x) cerr << #x << " = " << x << endl using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; const int MAXN = (int)5e5 + 5; vi adj[MAXN], leaf; int sub[MAXN]; int n, m; void dfs(int v, int pr = -1) { sub[v] = (sz(adj[v]) == 1); for (int to : adj[v]) { if (pr != to) { dfs(to, v); sub[v] += sub[to]; } } } int cen(int v, int lim, int pr = -1) { for (int to : adj[v]) { if (to != pr && sub[to] > lim / 2) { return cen(to, lim, v); } } return v; } void dfsCol(int v, int pr, int c) { if (sz(adj[v]) == 1) { leaf.pb(v); } for (int to : adj[v]) { if (to != pr) { dfsCol(to, v, c); } } } void solve() { cin >> n; rep (i, 1, n) { int u, v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } dfs(1); int tot = sub[1]; int root = cen(1, tot); for (int to : adj[root]) { dfsCol(to, root, ++m); } cout << (tot + 1) / 2 << '\n'; if (tot % 2 == 0) { for (int i = 0; i < tot / 2; i++) { cout << leaf[i] << ' ' << leaf[i + tot / 2] << '\n'; } } else { for (int i = 0; i <= tot / 2; i++) { cout << leaf[i] << ' ' << leaf[i + tot / 2] << '\n'; } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tt = 1; for (int i = 1; i <= tt; ++i) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...