제출 #394707

#제출 시각아이디문제언어결과실행 시간메모리
394707Parsa_PGNetwork (BOI15_net)C++14
100 / 100
693 ms65360 KiB
/* Man BINAHAYATO Mikham */ #include <bits/stdc++.h> #define pb push_back #define endl "\n" #define ll long long using namespace std; const int maxn = 1e6 + 10, Maxn = 1e5 + 10, SQ = 360 , lg = 22 ; const int mod = 1e9 + 7; const long long inf = 1e18 + 10; int sum[maxn], maxx[maxn], cnt, root; vector<int> adj[maxn], vec; void find_root(int v, int par){ for(auto u: adj[v]){ if(u == par) continue; find_root(u, v); sum[v] += sum[u]; maxx[v] = max(maxx[v], sum[u]); } maxx[v] = max(maxx[v], cnt - sum[v]); if(maxx[v] <= cnt/2) root = v; } void dfs(int v, int par){ if(adj[v].size() == 1) vec.pb(v); for(auto u : adj[v]) if(par != u) dfs(u, v); } int32_t main(){ ios:: sync_with_stdio(0), cin.tie(0), cout.tie(0); int n; cin >> n; for(int i = 0 ; i < n - 1 ; 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) cnt++; find_root(0, -1); dfs(root, -1); int x = cnt/2; cout << (cnt + 1)/2 << endl; for(int i = 0 ; i < (cnt + 1)/2 ; i++){ cout << vec[i] + 1 << ' ' << vec[min(cnt - 1, i + x)] + 1 << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...