반응형
문제 출처 :
https://www.codeground.org/practice/practiceProblemList
알고리즘 분석 :
문제 해결에 필요한 사항
1. 이분 그래프 확인
2. BFS
[13265번] 색칠하기 :: http://www.crocus.co.kr/839 이 문제와 그냥 같은 문제이다.
코드를 그대로 복사해서 인풋 형식 아웃 풋 형식만 바꿔 내도 맞는다.
해설은 다음과 같다. (위의 링크 해설과 동일하다.)
이 문제는 이분 그래프로 표현 할 수 있는가? 라는 문제이다.
즉, 이분 매칭을 해라 라는 문제가 아니고 이러한 그래프는 이분 그래프로 표현 할 수 있는가를 묻는 것이다.
이분 그래프로 표현 할 수 있다는 의미는 각 정점들을 A 그룹 B 그룹으로 정확히 나눌 수 있어야 한다는 의미가 된다.
결국 BFS로 생각하면 이분 그래프가 되는지 안되는지 알 수 있다.
시작점을 잡고 그 점부터 시작해서 한칸씩 가며 1또는 -1로 색칠을 해주고 만약 이미 색칠되어있는 부분을 만났을 때
그 부분이 현재 정점의 색과 같다면 이분 그래프가 될 수 없다는 것이다는 것을 이용한다.
소스 코드 :
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #include <iostream> #include <cstdio> #include <queue> #include <vector> using namespace std; int main() { int tCase; scanf("%d", &tCase); for (int tc = 1; tc <= tCase; tc++) { int V, E; scanf("%d %d", &V, &E); vector<int> vc[202]; vector<bool> visit(202, false); vector<int> color(202); for (int i = 0; i < E; i++) { int from, to; scanf("%d %d", &from, &to); vc[from].push_back(to); vc[to].push_back(from); } int palette; bool chk = true; for (int i = 1; i <= V; i++) { if (visit[i]) continue; queue<int> q; q.push(i); while (!q.empty()) { int here = q.front(); q.pop(); if (visit[here]) continue; visit[here] = true; if (color[here] == 0) { color[here] = 1; palette = -1; } else if (color[here] == 1) palette = -1; else if (color[here] == -1) palette = 1; for (int i = 0; i < vc[here].size(); i++) { int next = vc[here][i]; if (color[next] != 0 && color[next] == -palette) { chk = false; break; } color[next] = palette; q.push(next); } if (!chk) break; } } chk == true ? printf("Case #%d\n1\n", tc) : printf("Case #%d\n0\n", tc); } return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[10986번] 나머지 합 (0) | 2017.05.04 |
---|---|
[1051번] 숫자 정사각형 (0) | 2017.05.04 |
[Codeground 42번] 부분배열 (0) | 2017.05.01 |
[Codeground 46번] 할인권 (0) | 2017.05.01 |
[13265번] 색칠하기 (0) | 2017.05.01 |