Submission #169420

#TimeUsernameProblemLanguageResultExecution timeMemory
169420gs18103Pipes (CEOI15_pipes)C++14
80 / 100
5030 ms13540 KiB
#include<bits/stdc++.h> const int N = 1e5 + 5; using namespace std; vector <int> G[N]; int n, m, low[N], num[N], cnt; struct dsu{ int pset[N]; void init(){ for (int i = 1; i <= n; i++) pset[i] = i; } int find(int i) {return ((pset[i] == i) ? i : pset[i] = find(pset[i]));} bool Union(int i, int j){ int u = find(i), v = find(j); if (u == v) return false; pset[u] = v; G[i].push_back(j); G[j].push_back(i); return true; } } a[2]; void dfs(int u, int p){ num[u] = low[u] = ++cnt; bool ck = false; for (auto v : G[u]){ if (v == p && !ck) {ck = true; continue;} if (num[v]){ low[u] = min(low[u], num[v]); } else{ dfs(v, u); low[u] = min(low[u], low[v]); } } if (u != p && low[u] >= num[u]) cout << u << " " << p << "\n"; } int main(){ cin >> n >> m; a[0].init(); a[1].init(); for (int i = 1; i <= m; i++){ int u, v; cin >> u >> v; if (!a[0].Union(u, v)) a[1].Union(u, v); } for (int i = 1; i <= n; i++) if (!num[i]) dfs(i, i); }
#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...