제출 #1189409

#제출 시각아이디문제언어결과실행 시간메모리
1189409heheNetwork (BOI15_net)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h> using namespace std; vector<vector<int>> adj; vector<int> depth, low; set<int> final; vector<bool> visited; int distanta = 0; void dfs(int u, int parent) { visited[u] = true; depth[u] = low[u] = distanta++; int children = 0; for (int v : adj[u]) { if (v == parent) continue; if (!visited[v]) { dfs(v, u); low[u] = min(low[u], low[v]); if ((parent == -1 && ++children > 1) || (parent != -1 && low[v] >= depth[u])) final.insert(u); } else { low[u] = min(low[u], depth[v]); } } } int main() { int n, a, b; cin >> n; adj.resize(n + 1); depth.resize(n + 1); low.resize(n + 1); visited.assign(n + 1, false); for (int i = 0; i < n; ++i) { cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } dfs(1, -1); vector<int> deg(n + 1, 0); for (int i = 1; i <= n; ++i) { if (final.count(i)) { for (int v : adj[i]) if (!final.count(v)) deg[v]++; } } vector<int> leaves; for (int i = 1; i <= n; ++i) if (!final.count(i) && deg[i] == 1) leaves.push_back(i); cout << (leaves.size() + 1) / 2 << "\n"; for (int i = 0; i + 1 < leaves.size(); i += 2) cout << leaves[i] << " " << leaves[i + 1] << "\n"; if (leaves.size() % 2 == 1) { int leaf = leaves.back(); int fallback = *final.begin(); cout << leaf << " " << fallback << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...