제출 #527145

#제출 시각아이디문제언어결과실행 시간메모리
527145chicken337Pipes (CEOI15_pipes)C++14
90 / 100
926 ms62220 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; int v, e, ID = 0; int num[MAXN], low[MAXN]; vector<int> adj[MAXN]; struct UFDS{ int p[MAXN]; char r[MAXN]; UFDS(){ for(int i = 0; i < v; i ++) p[i] = i, r[i] = 0; } int root(int x){ if(p[x] == x) return x; return p[x] = root(p[x]); } bool connected(int x, int y){ return root(x) == root(y); } void connect(int x, int y){ x = root(x), y = root(y); if(r[x] < r[y]) swap(x, y); if(r[x] == r[y]) r[x] ++; p[y] = x; } }; void dfs(int x, int par){ num[x] = low[x] = ID ++; for(int nxt : adj[x]){ if(num[nxt] == -1){ dfs(nxt, x); if(num[x] < low[nxt]) cout << x+1 << ' ' << nxt+1 << '\n'; low[x] = min(low[x], low[nxt]); } else if(nxt != par){ low[x] = min(low[x], num[nxt]); } else par = -1; } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> v >> e; int a, b; UFDS ua = UFDS(); UFDS ub = UFDS(); memset(num, -1, sizeof num); for(int i = 0; i < e; i ++){ cin >> a >> b; if(!ua.connected(a-1, b-1)){ adj[a-1].push_back(b-1); adj[b-1].push_back(a-1); ua.connect(a-1, b-1); } else if(!ub.connected(a-1, b-1)){ adj[a-1].push_back(b-1); adj[b-1].push_back(a-1); ub.connect(a-1, b-1); } } for(int i = 0; i < v; i ++) if(num[i] == -1) dfs(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...