반응형

문제 출처 :


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(202false);
        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] != && 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