본문 바로가기

ProgramSoliving

백준 : 1707

반응형

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

 

1707번: 이분 그래프

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수 E(1≤E≤200,000)가 빈 칸을 사이에 두고 순서대로 주어진다. 각 정점에는 1부터 V까지 차례로 번호가 붙어 있다. 이어서 둘째 줄부터 E개의 줄에 걸쳐 간선에 대한 정보가 주어지는데, 각 줄에 인접한 두 정점의 번호가 빈 칸을 사이에 두고 주어

www.acmicpc.net

 

이분그래프

이분그래프란 인접한 노드들을 서로 다른색으로 2가지경우로만 칠할수있는 그래프이다.

문제를 풀기위해서 BFS를 이용해서 현재노드들을 색칠하고 인접노드를 탐색하는 것을 구현하면된다.

 

또한 끊어지 노드들에 대한 이분그래프가 있을수도 잇으므로 for을 통해 탐색한다.

 

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
 
 
public class B1707_2 {
    static int K;
    static int V, E;
    static int color[];
    static ArrayList<Integer> list[];
 
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        K = Integer.parseInt(br.readLine());
 
        for (int k = 0; k < K; k++) {
            st = new StringTokenizer(br.readLine());
            V = Integer.parseInt(st.nextToken());
            E = Integer.parseInt(st.nextToken());
 
            list = new ArrayList[V + 1];
            for (int v = 1; v <= V; v++) {
                list[v] = new ArrayList<Integer>();
            }
 
 
            for (int e = 1; e <= E; e++) {
                st = new StringTokenizer(br.readLine());
                int u = Integer.parseInt(st.nextToken());
                int v = Integer.parseInt(st.nextToken());
                list[u].add(v);
                list[v].add(u);
            }
 
            String Answer = "YES";
            color = new int[V + 1];
            boolean isPossible = false;
            for(int v=1;v<=V;v++) {
                if(color[v]!=0)continue;
                color[v] = 1;
                
                Queue<Integer> q = new LinkedList<Integer>();
                q.add(v);
                
                while(!q.isEmpty()) {
                    int now = q.poll();
                    int c = color[now];
                    
                    int size = list[now].size();
                    
                    for(int s=0;s<size;s++) {
                        int tmp = list[now].get(s);
                        if(color[tmp]==c) {
                            //이분그래프안됨
                            Answer = "NO";
                            isPossible = true;
                            break;
                        }
                        
                        if(color[tmp] == 0) {
                            color[tmp] = c*-1;
                            q.add(tmp);
                        }
                        
                    }
                    
                    if(isPossible)break;
                    
                }
                
            }
 
            System.out.println(Answer);
        }
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 9019  (0) 2020.02.23
백준 : 9466 (텀 프로젝트)  (0) 2020.02.23
백준 : 4179  (0) 2020.02.20
백준 : 3109  (0) 2020.02.20
백준 : 2842 JAVA  (2) 2020.02.15