ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 - 1707, 이분 그래프
    취업 준비/알고리즘 2025. 2. 27. 17:21

    이분 그래프 성공

     
    시간 제한메모리 제한제출정답맞힌 사람정답 비율
    2 초 256 MB 108914 30502 18958 25.101%

    문제

    그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다.

    그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오.

    입력

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

    출력

    K개의 줄에 걸쳐 입력으로 주어진 그래프가 이분 그래프이면 YES, 아니면 NO를 순서대로 출력한다.

    제한

    • 2 ≤ K ≤ 5
    • 1 ≤ V ≤ 20,000
    • 1 ≤ E ≤ 200,000

    예제 입력 1 복사

    2
    3 2
    1 3
    2 3
    4 4
    1 2
    2 3
    3 4
    4 2
    

    예제 출력 1 복사

    YES
    NO

     

     

    import java.io.*;
    import java.util.*;
    
    public class baekjun_1707 {
        public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int T = Integer.parseInt(br.readLine());
    
            for (int test_case = 0; test_case < T; test_case++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                int V = Integer.parseInt(st.nextToken()); 
                int E = Integer.parseInt(st.nextToken()); 
    
                ArrayList<Integer>[] list = new ArrayList[V + 1]; 
                for (int i = 1; i <= V; i++) {  
                    list[i] = new ArrayList<>();
                }
    
                // 그래프 입력 받기
                for (int i = 0; i < E; i++) {
                    st = new StringTokenizer(br.readLine());
                    int left = Integer.parseInt(st.nextToken());
                    int right = Integer.parseInt(st.nextToken());
    
                    list[left].add(right);
                    list[right].add(left);
                }
    
                String answer = isBipartite(V, list);
                System.out.println(answer);
            }
        }
    
        static String isBipartite(int V, ArrayList<Integer>[] list) {
            int[] check = new int[V + 1];
            Arrays.fill(check, 0); 
            for (int i = 1; i <= V; i++) {
                if (check[i] == 0) { // 방문하지 않은 노드이면 BFS 실행
                    if (!bfs(i, list, check)) {
                        return "NO"; // 이분 그래프가 아니면 NO 반환
                    }
                }
            }
            return "YES"; // 모든 노드가 이분 그래프 조건을 만족하면 YES
        }
    
        static boolean bfs(int start, ArrayList<Integer>[] list, int[] check) {
            Queue<Integer> queue = new LinkedList<>();
            queue.add(start);
            check[start] = 1; // 시작점 1
    
            while (!queue.isEmpty()) {
                int cur = queue.poll();
                for (int neighbor : list[cur]) {
                    if (check[neighbor] == 0) { // 방문하지 않은 경우
                        check[neighbor] = -check[cur]; // 현재 노드와 다른 값으로 바꿔줌
                        queue.add(neighbor);
                    } else if (check[neighbor] == check[cur]) { // 인접한 두 노드가 같으면 이분 그래프 아님
                        return false;
                    }
                }
            }
            return true;
        }
    }
Designed by Tistory.