Submission #340190

#TimeUsernameProblemLanguageResultExecution timeMemory
340190blueNetwork (BOI15_net)C++11
100 / 100
940 ms50028 KiB
#include <iostream> #include <queue> using namespace std; int n; vector<int> edge[500001]; vector<int> edge_size(500001, 0); vector<int> p(500001, 0); vector<int> dfs_leaf; void dfs(int u) { if(edge[u].size() == 1) dfs_leaf.push_back(u); for(int v: edge[u]) { if(p[u] == v) continue; dfs(v); } } int main() { cin >> n; int a, b; for(int i = 1; i <= n-1; i++) { cin >> a >> b; edge[a].push_back(b); edge_size[a]++; edge[b].push_back(a); edge_size[b]++; } queue<int> tbv; for(int i = 1; i <= n; i++) if(edge_size[i] == 1) tbv.push(i); while(!tbv.empty()) { a = tbv.front(); tbv.pop(); for(int v: edge[a]) { if(p[v] == a) continue; p[a] = v; edge_size[v]--; if(edge_size[v] == 1) tbv.push(v); } } int root = a; dfs(root); int s = dfs_leaf.size(); if(s % 2 == 0) { cout << s/2 << '\n'; for(int i = 0; i < s/2; i++) cout << dfs_leaf[i] << ' ' << dfs_leaf[s/2 + i] << '\n'; } else { s--; cout << s/2 + 1 << '\n'; for(int i = 0; i < s/2; i++) cout << dfs_leaf[i] << ' ' << dfs_leaf[s/2 + i] << '\n'; cout << dfs_leaf[0] << ' ' << dfs_leaf[s] << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...