알고리즘 공부/문제 풀이

[JAVA] 백준 1707 이분 그래프

valid_ming 2021. 9. 28. 09:49

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

 

1707번: 이분 그래프

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에

www.acmicpc.net

import java.util.*;
import java.io.*;

public class Main {
    public static class Node {
        int idx;
        int set;
        public Node(int i, int s) {
            idx = i; set = s;
        }
    }

    public static void main(String[] args)throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();

        while(T-->0) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int V = Integer.parseInt(st.nextToken());
            int E = Integer.parseInt(st.nextToken());


            ArrayList<Integer>[] graph;
            boolean[] visit;
            Set<Integer> set1 = new HashSet<>();
            Set<Integer> set2 = new HashSet<>();

            graph = new ArrayList[V+1];
            for(int i=1; i<=V; i++) graph[i] = new ArrayList<>();
            for(int i=0;i<E;i++) {
                st = new StringTokenizer(br.readLine());
                int s = Integer.parseInt(st.nextToken());
                int e = Integer.parseInt(st.nextToken());
                graph[s].add(e);
                graph[e].add(s);
            }

            visit = new boolean[V+1];
            Queue<Node> q = new LinkedList<>();
            boolean res = false;

            loop: for(int v=1;v<=V;v++) {
                if(!visit[v]) {
                    set1.add(v);
                    q.add(new Node(v, 1));
                    visit[v] = true;
                }

                while (!q.isEmpty()) {
                    Node cur = q.poll();

                    ArrayList<Integer> list = graph[cur.idx];

                    for (int i = 0; i < list.size(); i++) {
                        int next = list.get(i);
                        if (!visit[next]) {
                            visit[next] = true;
                            if (cur.set == 1) {
                                set2.add(next);
                                q.add(new Node(next, 2));
                            } else {
                                set1.add(next);
                                q.add(new Node(next, 1));
                            }
                        } else {
                            if ((cur.set == 1 && !set2.contains(next)) || (cur.set == 2 && !set1.contains(next))) {
                                sb.append("NO\n");
                                res = true;
                                break loop;
                            }
                        }
                    }
                }

            }
            if(!res) sb.append("YES\n");
        }

        System.out.println(sb);

    }

}