# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
96878 | Retro3014 | Pipes (CEOI15_pipes) | C++17 | 5035 ms | 14856 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <stdio.h>
#include <vector>
#include <deque>
using namespace std;
#define MAX_N 100000
#define LN 17
typedef pair<int, int> pii;
int N, M;
vector<pii > gp[MAX_N+1];
int num[MAX_N+1];
int p[MAX_N+1][LN];
int up[MAX_N+1];
int lv[MAX_N+1];
pii edge[MAX_N+1];
int sz = 0;
void dfs(int x){
for(int i=0; i<gp[x].size(); i++){
if(gp[x][i].first==p[x][0]) continue;
dfs(gp[x][i].first);
if(up[gp[x][i].first]<=lv[x]) edge[gp[x][i].second].first = edge[gp[x][i].second].second = 0;
up[x] = min(up[x], up[gp[x][i].first]);
}
}
deque<int> dq;
void init_graph(int x){
}
int main(){
scanf("%d%d", &N, &M);
for(int i=1; i<=N; i++) num[i] = 1;
for(int i=1; i<=N; i++) lv[i] = up[i] = 1;
int a, b, k, tmp, t, A, B, x;
while(M--){
scanf("%d%d", &a, &b);
A = a; B = b;
for(int i=LN-1; i>=0; i--){
if(p[A][i]!=0) A = p[A][i];
if(p[B][i]!=0) B = p[B][i];
}
if(A==B){ A = a; B = b;
for(int i=LN-1; i>=0; i--){
if(lv[p[A][i]]>=lv[B]) A = p[A][i];
if(lv[p[B][i]]>=lv[A]) B = p[B][i];
}
for(int i=LN-1; i>=0; i--){
if(p[A][i]!=p[B][i]){
A = p[A][i]; B = p[B][i];
}
}
if(A!=B) A = p[A][0];
k = A; up[a] = min(up[a], lv[k]); up[b] = min(up[b], lv[k]);
}else{
if(num[A]>=num[B]){
tmp = a; a = b; b = tmp;
tmp = A; A = B; B = tmp;
}
num[B] += num[A];
dfs(A);
for(int i=1; i<LN; i++) p[a][i] = 0;
p[a][0] = b;
lv[a] = lv[b]+1;
gp[a].push_back({b, sz}); gp[b].push_back({a, sz});
dq.push_back(a);
while(!dq.empty()){
x = dq.front(); dq.pop_front();
up[x] = lv[x];
for(int i=1; i<LN; i++) p[x][i] = p[p[x][i-1]][i-1];
for(int i=0; i<gp[x].size(); i++){
if(gp[x][i].first==p[x][0]) continue;
lv[gp[x][i].first] = lv[x]+1;
p[gp[x][i].first][0] = x;
dq.push_back(gp[x][i].first);
}
}
edge[sz] = {a, b}; sz++;
}
}
for(int i=1; i<=N; i++){
int k = i;
for(int j=LN-1; j>=0; j--){
if(p[k][j]!=0) k = p[k][j];
}
if(k==i) dfs(k);
}
for(int i=0; i<sz; i++){
if(edge[i].first!=0 && edge[i].second!=0) printf("%d %d\n", edge[i].first, edge[i].second);
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |