반응형

문제 출처 :


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



알고리즘 분석 :


문제 해결에 필요한 사항

1. 이분 그래프

2. DFS


이 문제는 DFS, BFS 두가지 방법으로 풀 수 있는데 이번 코드에서는 DFS를 이용하여 문제를 해결하였다.


이분 그래프에 대한 기본 문제이며, DFS를 조금 더 깊게 바라봐 주도록 하는 문제인 듯 하다.


소스 코드에 대한 설명은 주석을 통해 모두 적어두었다.


소스 코드 : 


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
#include<iostream>
#include<vector>
#include<algorithm>
#include<stdio.h>
 
using namespace std;
 
int T, V, E, to, from;
int check[20002];
vector<int> v[20002];
 
/*
    check[pos] = color :: 현재 정점에 색을 부여해준다( + 방문 의미 )
    
    for(int i = 0 ; i < v[pos].size() ; i ++) 
    :: 해당하는 정점에 연결되어있는 모든 정점을 확인
    int next = v[pos][i]; :: 하나씩 정점을 확인 해 나가기 위한 변수
    if(check[next] == color) :: 만약, 이전에 dfs에 의해 check[next]가 이미 
    어떤 색으로 칠해져있었는데 그게 현재 정점 색과 같다면
    if(check[next] == -1 && !dfs(next, !color)) ::
    정점에 처음 왔고, 그 정점부터 시작해서 다시 dfs를 하며,
    색은 반대색을 넣어준다. (이분 그래프의 정의)
*/
bool dfs(int pos, int color)
{
    check[pos] = color;
 
    for (int i = 0; i < v[pos].size(); i++)
    {
        int next = v[pos][i];
        if (check[next] == color) return false;
        if (check[next] == -&& !dfs(next, !color)) return false;
    }
    return true;
}
 
 
int main()
{
    scanf("%d"&T);
 
    while (T--)
    {
        scanf("%d %d"&V, &E);
 
        // check 배열을 -1로 초기화 해준다
        fill(check, check + 20002-1);
 
        // 비방향 그래프에서 간선으로 연결된 서로 다른 두 정점을 이어준다.
        for (int i = 0; i < E; i++)
        {
            scanf("%d %d"&to, &from);
            v[to].push_back(from);
            v[from].push_back(to);
        }
 
        int graph = 1// graph == 1 ? 이분 그래프 : 이분 그래프 아니다.
 
        /*
            for(int i = 1 ; i <= V ; i ++) :: 모든 정점을 순회
            check[i] == -1 :: 아직 방문하지 않은 노드인가?
            dfs(i, 1) :: i번째 정점의 색을 1로해서 시작한다.
        */
 
        for (int i = 1; i <= V; i++)
            if (check[i] == -&& !dfs(i, 1))
            {
                graph = 0;
                break;
            }
        graph ? printf("YES\n") : printf("NO\n");
 
        for (int i = 0; i <= 20001; i++)
            v[i].clear();
    }
    return 0;
}        
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[2166번] 다각형의 면적  (2) 2016.11.07
[11727번] 2xn 타일링 2  (0) 2016.11.07
[13567번] Robot  (0) 2016.11.07
[13414번] 수강신청  (0) 2016.11.06
[2643번] 색종이 올려 놓기  (2) 2016.11.06