This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sp ' '
#define en '\n'
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
using namespace std;
const int N = 5e5 + 2;
const int mod = 1e9 + 7;
vector<int> g[N];
int szl[N];
vector<vector<int>> all;
void Dfs(int s, int e) {
for (int u : g[s]) {
if (u != e) {
Dfs(u, s);
szl[s] += szl[u];
}
}
smax(szl[s], 1);
}
int Dfs1(int s, int e, int t) {
for (int u : g[s]) {
if (u == e) continue;
if (2 * szl[u] > t) return Dfs1(u, s, t);
}
return s;
}
void Dfs2(int s, int e, int r) {
if (g[s].size() == 1) all.back().push_back(s);
for (int u : g[s]) {
if (u == e) continue;
if (s == r) all.push_back({});
Dfs2(u, s, r);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for (int i = 0; i < n - 1; i++) {
int u, v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
int root = 1;
for (int i = 1; i <= n; i++) if (g[i].size() > g[root].size()) root = i;
Dfs(root, 0);
root = Dfs1(root, 0, szl[root]);
Dfs2(root, 0, root);
int sz = all.size();
priority_queue<pair<int, int>> pq;
vector<array<int, 2>> ans;
for (int i = 0; i < sz; i++) pq.push({all[i].size(), i});
int who = -1;
while (pq.size() > 1) {
int x = pq.top().second; pq.pop();
int y = pq.top().second; pq.pop();
who = all[x].back();
ans.push_back({all[x].back(), all[y].back()});
all[x].pop_back(); all[y].pop_back();
if (all[x].size() > 0) pq.push({all[x].size(), x});
if (all[y].size() > 0) pq.push({all[y].size(), y});
}
if (pq.size() == 1) ans.push_back({who, all[pq.top().second].back()});
cout << ans.size() << en;
for (int i = 0; i < ans.size(); i++) {
cout << ans[i][0] << sp << ans[i][1] << en;
}
return 0;
}
Compilation message (stderr)
net.cpp: In function 'int main()':
net.cpp:70:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
70 | for (int i = 0; i < ans.size(); i++) {
| ~~^~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |