알고리즘

1707 이분 그래프

han1693516 2025. 11. 24. 18:14

 

각 노드에 번호를 1, 2 번갈아가며 저장하면서, 인접 노드가 자신과 같은 번호일 경우 NO를, 아니면 YES를 출력한다.

     - 모든 노드 대해 DFS 실행한다! (이어져있지 않는 노드 잇을 수 잇기 때문)

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

public class Main {
    
    static int n;
    static boolean hasCycle;
    static List<List<Integer>> arr;
    static int[] sets;
    static boolean [] isVisited;

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

        n = Integer.parseInt(br.readLine());
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            int v = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());

            sets = new int[v + 1];
            isVisited = new boolean[v + 1];
            arr = new ArrayList<>();
            for (int j = 0; j <= v; j++) {
                arr.add(new ArrayList<>());
            }

            for (int j = 0; j < e; j++) {
                st = new StringTokenizer(br.readLine());

                int start = Integer.parseInt(st.nextToken());
                int end = Integer.parseInt(st.nextToken());

                arr.get(start).add(end);
                arr.get(end).add(start);
            }

            hasCycle = false;

            for (int k = 1; k <= v; k++) {
                if (hasCycle) break;
                else {
                    sets[k] = 1;
                    solution(k, 1);
                    sets = new int[v + 1];
                }

            }
            System.out.println(hasCycle ? "NO" : "YES");
        }
    }

    static void solution(int currentPos, int currentSet) {
        if (hasCycle) return;

        isVisited[currentPos] = true;

        List<Integer> nextPosCandidates = arr.get(currentPos);
        int nextSet = 3 - currentSet; // 1 -> 2, 2 -> 1

        for (int nextPos : nextPosCandidates) {

            if (!isVisited[nextPos]) {
                sets[nextPos] = nextSet;
                solution(nextPos, nextSet);
            }

            else if (sets[nextPos] == sets[currentPos]) {
                hasCycle = true;
                break;
            }
        }
    }
}

'알고리즘' 카테고리의 다른 글

15684 사다리조작  (0) 2025.12.02
1325 효율적인 해킹  (0) 2025.11.24
1456 거의 소수  (0) 2025.11.23
1541 잃어버린 괄호  (0) 2025.10.28
1744 수 묶기  (0) 2025.10.28