정리충의 정리노트

[백준] 11400: 단절선 본문

PS/BFS & DFS

[백준] 11400: 단절선

ioqoo 2020. 2. 21. 21:27

0. 문제 주소

 

https://www.acmicpc.net/problem/11400

 

11400번: 단절선

첫째 줄에 두 정수 V(1≤V≤100,000), E(1≤E≤1,000,000)가 주어진다. 이는 그래프가 V개의 정점과 E개의 간선으로 이루어져 있다는 의미이다. 다음 E개의 줄에는 간선에 대한 정보를 나타내는 두 정수 A, B가 주어진다. 이는 A번 정점과 B번 정점이 연결되어 있다는 의미이며, 방향은 양방향이다. 그래프는 항상 연결되어 있으며, 같은 간선이 두 번 이상 들어오는 경우는 없다. 또, A와 B가 같은 경우도 없다. 그래프의 정점은 1부터

www.acmicpc.net

 

 

1. 풀이

 

[PS/BFS & DFS] - [BOJ] 11266: 단절점과 다른 점은 다음과 같다.

 

1. 루트 노드인지를 체크하지 않아도 된다.

2. DFS 탐색 함수에 parent 인자를 추가한다. 이는 low를 정의할 때, 바로 직전에서 내려온 parent는 고려하지 않기 위함이다.

3. 그리고 order[curr]가 low보다 strictly 작아야 한다.

 

다른 건 다 똑같다.

 

단절점이지만 단절선은 안되는 경우를 생각해보면 이해할 수 있다.

 

 

2. 풀이 코드

 

* 유의할 점

 

 

 

#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>

#define MAX 100003
#define INF 987654321
#define pii pair<int, int>

using namespace std;

int V, E;
int order[MAX];
vector<int> graph[MAX];
set<pii> ans;
int cnt;

int dfs(int curr, int parent){
    order[curr] = ++cnt;
    int ret = order[curr];
    
    for (int next: graph[curr]){
        if (next == parent) continue;
        
        if (!order[next]){
            int low = dfs(next, curr);
            if (order[curr] < low) {
                int a = min(curr, next), b = max(curr, next);
                ans.insert(pii(a, b));
            }
            ret = min(ret, low);
        }
        else{
            ret = min(ret, order[next]);
        }
    } 
    
    return ret;
}

int main(){
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    #endif
    
    scanf("%d %d", &V, &E);
    if (V==1) {
        printf("0\n");
        return 0;
    }
    for (int i=0;i<E;i++){
        int u, v;
        scanf("%d %d", &u, &v);
        graph[u].push_back(v);
        graph[v].push_back(u);
    }
    
    dfs(1, 0);
    
    
    printf("%d\n", ans.size());
    for (auto it=ans.begin();it!=ans.end();it++){
        auto p = *it;
        printf("%d %d\n", p.first, p.second);
    }
    
    
    return 0;
} 

 

 

'PS > BFS & DFS' 카테고리의 다른 글

[백준] 1967: 트리의 지름  (0) 2020.03.07
[백준] 11266: 단절점  (1) 2020.02.21
[백준] 1039: 교환  (0) 2020.02.03
[백준] 3055: 탈출  (0) 2020.02.03
[백준] 2668: 숫자고르기  (0) 2020.01.19
Comments