Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 17472
- 색종이 붙이기
- 9095
- 미세먼지 안녕!
- 구슬탈출2
- 연산자 끼워넣기
- Ajax
- django
- 장고
- 16637
- 인스타
- 로또
- 재귀
- 17143
- 댓글
- 14888
- Java
- 부분수열의 합
- 다리 만들기2
- 17144
- 1182
- 17136
- 6603
- 괄호추가하기
- 인스타그램
- 백준
- 따라하기
- 14502
- 좋아요
- 알고리즘
Archives
- Today
- Total
Be a developer
백준 1707 이분 그래프 본문
1번 집합과 2번 집합으로 나눠서 생각하기 위해서, bfs, dfs에 필요한 visit 배열이나 check배열을 bool로 선언하는 것이 아니라 int 배열로 선언하여, 0은 방문하지 않은 것, 1은 1번 집합 2는 2번 집합으로 둔다.
문제에서 조건을 잘 봐야 한다. v<=20,000인데 전에 풀던 코드를 그대로 쓰다보니 런타임 에러가 계속 발생했다.
문제 조건을 놓치지 말자.
또한, vector.clear()함수를 통해서 초기화 해주는 작업을 놓치지 말자.
테스트 케이스가 여러 개가 되는 경우는 특히 조심하자.
자세한 설명은 아래 주석으로..
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
55
56
57
58
59
60
61
62
63
64
|
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int n, m;
int color[1000000];
vector<int> g[20001];
bool dfs(int x, int c) {
color[x] = c;
for (int i = 0; i < g[x].size(); i++) {
int next = g[x][i];
if (color[next] == 0) {
//현재 node가 1번 집합이면, 다음은 2번 집합이 될 것.
//현재 node가 2번 집합이면, 다음은 1번 집합이 될 것.
//bool값을 반환하므로, 재귀적으로 들어가서 false가 나오면 false를 반환해야 한다.
if (dfs(next, 3 - c) == false) return false;
}
//방문한 적이 있을 때, 현재 node와 다음 들어갈 node의 색이 같으면 false
else if (color[x] == color[next]) return false;
}
return true;
}
int main(int argc, char** argv) {
int t;
cin >> t;
while (t--) {
cin >> n >> m;
//테스트 케이스가 여러 개니까 check 배열을 초기화 해준다.
//그래프도 초기화 해준다.
for (int i = 1; i <= n; i++) {
//0은 방문하지 않은 것
color[i] = 0;
g[i].clear();
}
for (int i = 0; i < m; i++) {
int from, to;
cin >> from >> to;
g[from].push_back(to);
g[to].push_back(from);
}
//방문 안한곳이 없도록 다 돌려준다.
bool ok = true;
for (int i = 1; i <= n; i++) {
//처음 방문하는 곳은 1번 집합으로 만든다.
if (color[i] == 0) {
if (dfs(i, 1) == false)ok = false;
}
}
if (ok)printf("YES\n");
else printf("NO\n");
}
return 0;
}
|
cs |
'알고리즘' 카테고리의 다른 글
백준 4963 섬의 개수 (0) | 2019.04.07 |
---|---|
백준 2667 단지번호붙이기 (0) | 2019.04.07 |
백준 11724 연결 요소의 개수 (0) | 2019.04.05 |
백준 1260 DFS와 BFS (0) | 2019.04.05 |
백준 15652 N과 M (4) (0) | 2019.04.04 |
Comments