답안 #100627

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
100627 2019-03-12T23:15:58 Z doowey Pipes (CEOI15_pipes) C++14
100 / 100
1847 ms 9464 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const int N = (int)1e5+1;
int n1[N], n2[N];
int r1[N], r2[N];
int tin[N], low[N];
int nd[4 * N], pv[4 * N];
int las[N];
int timer;
int cnt;

void add(int a, int b){ // a -> b
    nd[cnt]=b;
    pv[cnt]=las[a];
    las[a]=cnt;
    cnt ++ ;
}

void EDGE(int a, int b){
    add(a,b);
    add(b,a);
}

int fin1(int x){
    while(n1[x] != x) x=n1[x];
    return x;
}
int fin2(int x){
    while(n2[x] != x) x=n2[x];
    return x;
}

bool merg1(int a, int b){
    a=fin1(a);
    b=fin1(b);
    if(a==b) return false;
    if(r1[a] > r1[b])
        swap(a,b);
    r1[b]+=r1[a];
    n1[a]=b;
    return true;
}
bool merg2(int a, int b){
    a=fin2(a);
    b=fin2(b);
    if(a==b) return false;
    if(r2[a] > r2[b])
        swap(a,b);
    r2[b]+=r2[a];
    n2[a]=b;
    return true;
}

void Init(){
    for(int i = 0 ; i < N ; i ++ ){
        n1[i] = i, n2[i] = i;
        tin[i] = -1, low[i] = -1;
        las[i] = -1;
        r1[i] = 1, r2[i] = 1;
    }
    for(int i = 0 ; i < 4 * N ; i ++ ){
        nd[i] = -1;
        pv[i] = -1;
    }
}

void dfs(int node, int par){
    tin[node] = timer ++ ;
    low[node] = tin[node];
    for(int j = las[node] ; j != -1 ; j = pv[j]){
        if(nd[j] == par){
            continue;
        }
        if(tin[nd[j]] != -1){
            low[node] = min(low[node], tin[nd[j]]);
        }
        else{
            dfs(nd[j], node);
            low[node] = min(low[node], low[nd[j]]);
            if(tin[node] < low[nd[j]] && fin2(node) != fin2(nd[j])){
                cout << node << " " << nd[j] << "\n";
            }
        }
    }
}

int main(){
    fastIO;
    Init();
    int n, m;
    cin >> n >> m;
    int u, v;
    for(int i = 0 ; i < m ; i ++ ){
        cin >> u >> v;
        if(merg1(u,v))
            EDGE(u, v);
        else if(merg2(u,v))
            EDGE(u, v);
    }
    for(int i =1 ; i <= n; i ++ )
        if(tin[i] == -1) dfs(i,-1);
    return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 6144 KB Output is correct
2 Correct 7 ms 6244 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 6272 KB Output is correct
2 Correct 10 ms 6272 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 122 ms 6252 KB Output is correct
2 Correct 116 ms 6264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 202 ms 6508 KB Output is correct
2 Correct 240 ms 6264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 329 ms 6892 KB Output is correct
2 Correct 285 ms 6648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 480 ms 8432 KB Output is correct
2 Correct 432 ms 6504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 735 ms 8808 KB Output is correct
2 Correct 711 ms 7544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 997 ms 9464 KB Output is correct
2 Correct 922 ms 6648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1303 ms 9452 KB Output is correct
2 Correct 1225 ms 6648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1847 ms 9204 KB Output is correct
2 Correct 1471 ms 7796 KB Output is correct