반응형

www.acmicpc.net/problem/1707

 

1707번: 이분 그래프

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// https://www.acmicpc.net/board/view/25583
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int k, v, e, a, b, arr[20001];
vector<vector<int> > vec;
void dfs(int now) {
    // 현재 정점이 속한 그룹이 없을 때 (0일 때)
    if (!arr[now])
        arr[now] = 1;
 
    // 현재 정점이 속한 그룹이 있다면
    // 연결된 정점은 무조건 현재 정점과 반대가 되어야 함
    for (int i : vec[now]) {
        if (!arr[i]) {
            arr[i] = (arr[now] == 1 ? 2 : 1);
            dfs(i);
        }
    }
}
 
bool chk() {
    for (int i = 0; i < vec.size(); i++) {
        for (int j : vec[i]) {        // 나와 연결된 모든 정점 탐색
            if (arr[i] == arr[j])    // 연결된 정점은 무조건 다른 그룹이어야 함
                return false;        // 연결된 정점이 같은 그룹이면 FALSE
        }
    }
    return true;
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> k;
    while (k--) {
        cin >> v >> e;
        memset(arr, 0sizeof(arr));
        vec.clear();
        vec.resize(v+1);
        for (int i = 0; i < e; i++) {
            cin >> a >> b;
            vec[a].push_back(b);
            vec[b].push_back(a);
        }
        // 모든 정점에 대해서 탐색
        for (int i = 0; i < v;i++) {
            // 해당 정점이 속한 그룹이 없으면 (0이면)
            if (!arr[i])
                dfs(i);
        }
        cout << (chk() ? "YES" : "NO"<< '\n';
    }
}
cs
반응형

'백준 > DFS, BFS' 카테고리의 다른 글

백준 13913  (0) 2021.02.19
백준 2178  (0) 2021.02.19
백준 13023  (0) 2021.02.19
백준 2583  (0) 2021.02.03
백준 2468  (0) 2021.02.03

+ Recent posts