Submission #1081736

#TimeUsernameProblemLanguageResultExecution timeMemory
1081736EliasPipes (CEOI15_pipes)C++17
50 / 100
759 ms49208 KiB
#include <bits/stdc++.h> using namespace std; struct UnionFind { vector<int> parent; UnionFind(int n) { parent.resize(n); for (int i = 0; i < n; i++) parent[i] = i; } int find(int a) { if (parent[a] == a) return a; return parent[a] = find(parent[a]); } bool unite(int a, int b) { a = find(a); b = find(b); if (a == b) return false; parent[a] = b; return true; } }; vector<vector<pair<int, int>>> adj; vector<int> low, pre; int timer = 0; void dfs_bridges(int i, int p) { pre[i] = low[i] = timer++; for (auto [c, j] : adj[i]) { if (j == p) continue; if (pre[c] != -1) { low[i] = min(low[i], pre[c]); } else { dfs_bridges(c, j); if (low[c] > pre[i]) { cout << i + 1 << " " << c + 1 << "\n"; } low[i] = min(low[i], low[c]); } } } signed main() { cin.tie(0); ios_base::sync_with_stdio(false); int n, m; cin >> n >> m; adj.resize(n); pre = low = vector<int>(n, -1); UnionFind comp(n); UnionFind bridge(n); int edge_index = 0; while (m--) { int a, b; cin >> a >> b; a--, b--; if (comp.unite(a, b)) { adj[a].push_back({b, edge_index}); adj[b].push_back({a, edge_index}); edge_index++; } else if (bridge.unite(a, b)) { adj[a].push_back({b, edge_index}); adj[b].push_back({a, edge_index}); edge_index++; } } for (int i = 0; i < n; i++) { if (pre[i] == -1) dfs_bridges(i, -1); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...