제출 #527146

#제출 시각아이디문제언어결과실행 시간메모리
527146chicken337Pipes (CEOI15_pipes)C++14
100 / 100
998 ms14160 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; int v, e, ID = 0; vector<int> num, low; vector<int> adj[MAXN]; struct UFDS{ vector<int> p; vector<char> r; UFDS(){ p.resize(v); r.resize(v); 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(); num.assign(v, -1); low.assign(v, -1); 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...