답안 #873177

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
873177 2023-11-14T15:10:40 Z Faisal_Saqib Pipes (CEOI15_pipes) C++17
100 / 100
841 ms 15088 KB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 1;
int par1[N], par2[N], h[N], mnh[N], edges;
bitset<N> vis;
vector<pair<int, int>> g[N];

int root1(int& v){
    return (par1[v] == -1 ? v : par1[v] = root1(par1[v]));
}

int root2(int& v){
    return (par2[v] == -1 ? v : par2[v] = root2(par2[v]));
}

void merge1(int& u, int& v){    
    int r1 = root1(v);
    int r2 = root1(u);

    par1[r1] = r2;

    edges++;
    g[v].push_back({u, edges});
    g[u].push_back({v, edges});
}

void merge2(int& u, int& v){
    int r1 = root2(u);
    int r2 = root2(v);

    if (r1 == r2)
        return;

    par2[r1] = r2;

    edges++;
    g[v].push_back({u, edges});
    g[u].push_back({v, edges});
}

void dfs(int& v, pair<int, int> prev = {-1, -1}){
    vis[v] = 1;
    if (prev.first == -1)
        h[v] = 0;
    mnh[v] = h[v];

    for (auto& [u, id] : g[v]){
         if (prev.first == u and prev.second == id)
            continue;

        mnh[v] = min(mnh[v], h[u]);

        if (vis[u])
            continue;

        h[u] = h[v] + 1;
        dfs(u, {v, id});
        mnh[v] = min(mnh[v], mnh[u]);

        if (mnh[u] >= h[u])
            printf("%d %d\n", u, v);
            
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n, m,u,v;
    scanf("%d%d", &n, &m);

    for (int i=1; i<=n; i++){
        par1[i] = par2[i] = -1;
        mnh[i] = n + 100;
        h[i] = n + 100;
    }

    for (int i=0; i<m; i++){
        scanf("%d%d", &u, &v);

        if (root1(u) != root1(v))
            merge1(u, v);
        else if (root2(u) != root2(v))
            merge2(u, v);
    }

    for (int v = 1; v <= n; v++)
        if (!vis[v])
            dfs(v);
}

Compilation message

pipes.cpp: In function 'int main()':
pipes.cpp:72:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   72 |     scanf("%d%d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~
pipes.cpp:81:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   81 |         scanf("%d%d", &u, &v);
      |         ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 3164 KB Output is correct
2 Correct 5 ms 3164 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 74 ms 3156 KB Output is correct
2 Correct 71 ms 3092 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 120 ms 3824 KB Output is correct
2 Correct 144 ms 3664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 213 ms 5628 KB Output is correct
2 Correct 167 ms 5200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 280 ms 11696 KB Output is correct
2 Correct 245 ms 8360 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 422 ms 12752 KB Output is correct
2 Correct 390 ms 9452 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 546 ms 15088 KB Output is correct
2 Correct 521 ms 10896 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 660 ms 14936 KB Output is correct
2 Correct 653 ms 10836 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 841 ms 14508 KB Output is correct
2 Correct 809 ms 11100 KB Output is correct