Submission #117656

#TimeUsernameProblemLanguageResultExecution timeMemory
117656minhtung0404Pipes (CEOI15_pipes)C++17
70 / 100
3724 ms65536 KiB
//https://oj.uz/problem/view/CEOI15_pipes #include<bits/stdc++.h> const int N = 1e5 + 5; using namespace std; typedef pair <int, int> ii; vector <ii> 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 id){ int u = find(i), v = find(j); if (u == v) return false; pset[u] = v; G[i].push_back(ii(j, id)); G[j].push_back(ii(i, id)); return true; } } a[2]; void dfs(int u, int p, int id){ num[u] = low[u] = ++cnt; for (auto pr : G[u]){ int v = pr.first, x = pr.second; if (x == id) continue; if (num[v]){ low[u] = min(low[u], num[v]); } else{ dfs(v, u, x); 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(); int u, v; for (int i = 1; i <= m; i++){ cin >> u >> v; if (!a[0].Union(u, v, i)) a[1].Union(u, v, i); } for (int i = 1; i <= n; i++) if (!num[i]) dfs(i, i, 0); }
#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...