답안 #100624

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
100624 2019-03-12T23:09:09 Z doowey Pipes (CEOI15_pipes) C++14
100 / 100
1219 ms 8676 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 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){
    if(n1[x] == x) return x;
    return n1[x]=fin1(n1[x]);
}
int fin2(int x){
    if(n2[x] == x) return x;
    return n2[x]=fin2(n2[x]);
}

bool merg1(int a, int b){
    a=fin1(a);
    b=fin1(b);
    if(a==b) return false;
    n1[a]=b;
    return true;
}
bool merg2(int a, int b){
    a=fin2(a);
    b=fin2(b);
    if(a==b) return false;
    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;
    }
    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 5504 KB Output is correct
2 Correct 6 ms 5376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 5604 KB Output is correct
2 Correct 8 ms 5376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 103 ms 5464 KB Output is correct
2 Correct 97 ms 5480 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 170 ms 5724 KB Output is correct
2 Correct 188 ms 5468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 294 ms 6104 KB Output is correct
2 Correct 259 ms 5848 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 383 ms 7648 KB Output is correct
2 Correct 332 ms 5728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 576 ms 8024 KB Output is correct
2 Correct 582 ms 6752 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 845 ms 8676 KB Output is correct
2 Correct 834 ms 5852 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 966 ms 8668 KB Output is correct
2 Correct 914 ms 5856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1219 ms 8408 KB Output is correct
2 Correct 1103 ms 7004 KB Output is correct