백준 20040 -사이클 게임

Minjae An·2023년 9월 6일
0

PS

목록 보기
77/148
post-custom-banner

문제

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

리뷰

유니온 파인드로 풀이할 수 있는 전형적인 문제였다.

입력 노드들을 유니온 파인드 연산으로 처리하며 이미 같은 분리집합 내에
속한 노드들에 대한 입력이 주어졌을 때 사이클이 발생한 것이므로
순서를 기록하여 답을 도출할 수 있다.

로직의 시간복잡도는 입력의 처리하는 부분에서 O(ma(n))O(ma(n))으로 수렴하므로
n=500,000n=500,000,m=1,000,000m=1,000,000인 최악의 경우에도 무난히 제한 조건 1초를
통과할 수 있다.

코드

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

import static java.lang.Integer.parseInt;

public class Main {
    static int[] parent;

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

        parent = new int[n];
        Arrays.fill(parent, -1);

        int u, v, r1, r2;
        int seq = 0;

        for (int i = 1; i <= m; i++) {
            st = new StringTokenizer(br.readLine());

            u = parseInt(st.nextToken());
            v = parseInt(st.nextToken());

            r1 = find(u);
            r2 = find(v);

            if (r1 == r2) {
                if (seq == 0) {
                    seq = i;
                } else {
                    seq = Math.min(seq, i);
                }

                continue;
            }

            if (parent[r1] < parent[r2]) {
                parent[r1] += parent[r2];
                parent[r2] = r1;
            } else {
                parent[r2] += parent[r1];
                parent[r1] = r2;
            }
        }

        System.out.println(seq);
        br.close();
    }

    static int find(int u) {
        if (parent[u] < 0) return u;

        return parent[u] = find(parent[u]);
    }
}

결과

profile
먹고 살려고 개발 시작했지만, 이왕 하는 거 잘하고 싶다.
post-custom-banner

0개의 댓글