ALGORITHM

[JAVA] 백준 1707번- 이분 그래프

연듀 2023. 1. 6. 16:21

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

 

1707번: 이분 그래프

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

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
    static ArrayList<ArrayList<Integer>> list;
    static int[] colors;
    static boolean check;

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

        while (k-- > 0) {
            list = new ArrayList<>();
            st = new StringTokenizer(br.readLine());
            int v = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());

            colors = new int[v + 1]; // 각 정점의 색
            check = true;

            for (int i = 0; i <= v; i++) {
                list.add(new ArrayList<>());
            }
            for (int i = 0; i < e; i++) {
                st = new StringTokenizer(br.readLine());
                int start = Integer.parseInt(st.nextToken());
                int end = Integer.parseInt(st.nextToken());
                list.get(start).add(end);
                list.get(end).add(start);
            }

            for (int i = 1; i <= v; i++) {
                if (!check) break;

                if (colors[i] == 0) { // 방문하지 않은 정점이라면
                    dfs(i, 1);
                }
            }
            System.out.println(check ? "YES" : "NO");
        }
    }

    static void dfs(int v, int color) {
        colors[v] = color;

        for (int next : list.get(v)) {
            if (colors[next] == color) { // 인접한 정점과 색이 같으면 이분 그래프가 아님
                check = false;
                return;
            }
            if (colors[next] == 0) { // 방문하지 않은 정점이라면
                dfs(next, -color); // 다음 정점 다른 색으로 체크 
            }
        }

    }
}

 

이분 그래프는 인접한 정점끼리 서로 다른 색으로 칠해서 모든 정점을 두 가지 색으로만 칠할 수 있는 그래프라고 보면된다.

 

 

'ALGORITHM' 카테고리의 다른 글

[JAVA] 백준 13913번- 숨바꼭질 4  (0) 2023.01.09
[JAVA] 백준 1697번- 숨바꼭질  (0) 2023.01.09
[JAVA] 백준 1987번- 알파벳  (0) 2023.01.06
[JAVA] 백준 2580번- 스도쿠  (0) 2023.01.06
[JAVA] 백준 16198번- 에너지 모으기  (0) 2023.01.04