관리 메뉴

Partially Committed

[Union and Find] λ°±μ€€ 20040 사이클 κ²Œμž„ λ³Έλ¬Έ

πŸ”₯ Algorithm || λ¬Έμ œν’€μ΄/PS

[Union and Find] λ°±μ€€ 20040 사이클 κ²Œμž„

WonderJay 2023. 3. 7. 08:44
728x90
λ°˜μ‘ν˜•
SMALL

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

 

20040번: 사이클 κ²Œμž„

사이클 κ²Œμž„μ€ 두 λͺ…μ˜ ν”Œλ ˆμ΄μ–΄κ°€ μ°¨λ‘€λŒ€λ‘œ λŒμ•„κ°€λ©° μ§„ν–‰ν•˜λŠ” κ²Œμž„μœΌλ‘œ, μ„  ν”Œλ ˆμ΄μ–΄κ°€ ν™€μˆ˜ 번째 μ°¨λ‘€λ₯Ό, ν›„ ν”Œλ ˆμ΄μ–΄κ°€ 짝수 번째 μ°¨λ‘€λ₯Ό μ§„ν–‰ν•œλ‹€. κ²Œμž„ μ‹œμž‘ μ‹œ 0 λΆ€ν„° n − 1 κΉŒμ§€ κ³ μœ ν•œ

www.acmicpc.net

 

N λͺ…μ˜ μ„ μˆ˜κ°€ 선뢄을 λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ κ·Έλ¦¬λŠ” κ²Œμž„μ„ M μ°¨λ‘€κΉŒμ§€ μ§„ν–‰ν–ˆμ„ λ•Œ,

 

쀑간에 사이클이 생긴닀면 사이클이 μƒκ²Όλ˜ 회차λ₯Ό,

 

M 번 μ§„ν–‰ν•˜λŠ” λ™μ•ˆ 사이클이 λ°œμƒν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ 0 을 좜λ ₯ν•˜λ©΄ λœλ‹€.

 

예제λ₯Ό 톡해 μƒκ°ν•΄λ³΄μž.

 

0 κ³Ό 1 을 μ„ νƒν•˜μ—¬ 0-1 선뢄을 κΈ‹λŠ”λ‹€λŠ” 것은 0 κ³Ό 1 은 같은 μ§‘ν•©μœΌλ‘œ Clustering λœλ‹€λŠ” 것이닀.

m 번의 νšŒμ°¨λ§ˆλ‹€ μ£Όμ–΄μ§€λŠ” 두 포인트λ₯Ό 같은 μ§‘ν•©μœΌλ‘œ Clustering ν•˜λŠ” μž‘μ—…μ„ κ±°μΉ  λ•Œ, 사이클을 μ΄λ£¨λŠ” κ²½μš°κ°€ μ—†μœΌλ―€λ‘œ 닡은 0 이닀.

 

λ§ˆμ°¬κ°€μ§€λ‘œ m 번의 νšŒμ°¨λ§ˆλ‹€ μ£Όμ–΄μ§€λŠ” 두 점을 ν•˜λ‚˜μ˜ μ§‘ν•©μœΌλ‘œ clustering 을 μ§„ν–‰ν•œλ‹€.

κ·ΈλŸ¬λ‹€ 보면 m = 4 일 λ•Œ, 이미 같은 집합에 놓인 두 포인트λ₯Ό 같은 μ§‘ν•©μœΌλ‘œ clustering ν•˜λŠ” 상황이 λ°œμƒν•˜λ©° μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” 사이클이 λ°œμƒν•œ 것이라고 ν•  수 μžˆλ‹€. μ™œλƒλ©΄ 0 -> 1-> 3-> 0 의 μˆœν™˜ ꡬ쑰가 ν˜•μ„±λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

문제 상황은 μ΄ν•΄ν–ˆκ³ , 이λ₯Ό μ–΄λ–»κ²Œ κ΅¬ν˜„ν• κΉŒ?

 

같은 μ§‘ν•©μœΌλ‘œ ν•©μΉ˜κ³ , μ°Ύκ³  이런 연산을 λ°˜λ³΅ν•΄μ•Ό ν•˜λŠ”λ°..

 

그러면 μœ λ‹ˆμ˜¨ νŒŒμΈλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆκ² λ‹€.

 

μ‹œκ°„λ³΅μž‘λ„λ₯Ό 생각해보면,

 

union 연산은 find 연산에 μ „μ μœΌλ‘œ μ˜μ‘΄ν•˜λŠ”λ°

 

find 연산을 κ΅¬ν˜„ν•  λ•Œ 경둜λ₯Ό λ‹¨μΆ•μ‹œμΌœ μ‹œκ°„λ³΅μž‘λ„λ₯Ό μ€„μ΄λŠ” 방법이 λ³΄νŽΈν™”λ˜μ–΄μžˆλ‹€.

 

κ·Έλ ‡κ²Œ ν–ˆμ„ λ•Œμ— μ‹œκ°„ λ³΅μž‘λ„λŠ” μ• μ»€λ§Œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ O(a(N)) 이라고 ν•œλ‹€.

 

x κ°€ 2^65536 일 λ•Œ a(x) 이 5 κ°€ λœλ‹€κ³  ν•˜λ―€λ‘œ O(a(N)) ~= O(1) 이라고 생각해도 λ¬΄λ¦¬λŠ” μ—†κ² λ‹€.

 

κ·ΈλŸ¬λ―€λ‘œ, μœ λ‹ˆμ˜¨ νŒŒμΈλ“œλ₯Ό μ‚¬μš©ν•΄λ„

 

μ‹œκ°„ λ³΅μž‘λ„μ— μ œν•œ 없이 해결이 κ°€λŠ₯ν•  κ²ƒμ΄λΌλŠ” 것을 μ˜ˆμƒν•  수 μžˆλ‹€.

 

전체 μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

 

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

public class Main {
    static int n; // 점의 개수
    static int m; // ν˜„μž¬ μ§„ν–‰λœ μ°¨λ‘€μ˜ 수
    static int[] parent;

    public static void main(String[] args) throws IOException {
        System.setIn(new FileInputStream("src/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer stk;

        stk = new StringTokenizer(br.readLine());
        n = Integer.parseInt(stk.nextToken());
        m = Integer.parseInt(stk.nextToken());

        parent = new int[n];
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }

        int ans = 0;
        for (int i = 1; i <= m; i++) {
            stk = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(stk.nextToken());
            int b = Integer.parseInt(stk.nextToken());
            if(isitsame(a, b)){
                ans = i;
                break;
            } else {
                union(a, b);
            }
        }

        bw.write(ans+"\n");
        bw.flush();
        bw.close();
    }
    private static void union(int a, int b){
        a = find(a);
        b = find(b);
        if(a!=b){
            parent[b] = a;
        }
    }
    private static int find(int a){
        if(parent[a] == a){
            return a;
        } else {
            return parent[a] = find(parent[a]);
        }
    }
    private static boolean isitsame(int a, int b){
        a = find(a);
        b = find(b);
        if(a==b){
            return true;
        } else return false;
    }
}
728x90
λ°˜μ‘ν˜•
LIST
Comments