본문 바로가기
Problem Solving/Baekjoon

[백준] 1707 이분 그래프 - Graph Theory / Java

by graycode 2022. 10. 3.

 문제 링크

 

1707번: 이분 그래프

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

www.acmicpc.net

 

 풀이 과정

 

• 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

    static List<Integer>[] graph;
    static int[] visit;
    static boolean isBipartite;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int k = Integer.parseInt(br.readLine());

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

            graph = new ArrayList[v + 1];
            visit = new int[v + 1];
            isBipartite = false;

            for (int i = 1; i <= v; i++)
                graph[i] = new ArrayList<>();

            for (int i = 0; i < e; i++) {
                st = new StringTokenizer(br.readLine());
                int src = Integer.parseInt(st.nextToken());
                int dest = Integer.parseInt(st.nextToken());

                graph[src].add(dest);
                graph[dest].add(src);
            }

            for (int i = 1; i <= v; i++) {
                if (visit[i] == 0)
                    dfs(i, 1);
            }

            bw.write((isBipartite ? "NO" : "YES") + "\n");
        }

        bw.flush();
    }

    private static void dfs(int node, int color) {
        visit[node] = color;

        if (isBipartite)
            return;

        for (int i : graph[node]) {
            if (visit[i] == visit[node]) {
                isBipartite = true;
                return;
            }
            if (visit[i] == 0)
                dfs(i, color * -1);
        }
    }

}

댓글