본문 바로가기
알고리즘/그래프

[java 백준] 20040번 사이클게임

by Meaning_ 2022. 9. 9.
728x90
반응형

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

 

20040번: 사이클 게임

사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
class Main {
 
    public static int n;
    public static int m;
 
    public static int []parents;
 
    public static int find(int a){
        if(parents[a]!=a){
            parents[a]=find(parents[a]); //끝까지 부모를 찾아낸다.
        }
 
        return parents[a]; //이게 중요! 왜??
        //만약에 a는 2이고 parents[a]=1일 때
        //2의 부모는 1이 맞음
        //그렇기에 a가 2일때 부모인 1을 뱉어내야함
    }
 
    public static void union(int a,int b){
        a=find(a);
        b=find(b);
 
        if(a<b){
            parents[b]=a;
        }
        else{
            parents[a]=b;
        }
    }
 
 
 
    
 
 
 
 
 
 
    public static void main(String args[]) throws NumberFormatException, IOException {
 
       BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
       StringTokenizer st;
       st=new StringTokenizer(br.readLine());
       n=Integer.parseInt(st.nextToken());
       m=Integer.parseInt(st.nextToken());
       
       //여행 계획에 있는 도시들의 부모가 다 같으면 됨
 
        parents=new int[n+1];
 
        for(int i=0;i<n;i++){
            parents[i]=i;
        }
 
 
       for(int i=0;i<m;i++){
           st=new StringTokenizer(br.readLine());
           int a=Integer.parseInt(st.nextToken());
           int b=Integer.parseInt(st.nextToken());
           if(find(a)==find(b)){
               System.out.println(i+1);
               return;
           }else{
               union(a,b);
           }
       }
 
 
       System.out.println(0);
 
 
      
 
 
 
 
 
 
 
    }
 
}
cs

 

이 문제는 유니온 파인드로 푸는 문제였다. 결국에 사이클이 발생하는 경우는 같은 집합인 경우고 부모노드가 같은 애들이기 때문이다! 하지만 이 부모가 같은걸 판단하는 시점이 언젠지 파악하는게 중요 했다. 우선 find를 통해 부모가 같은지 판단을 하고 같으면 종료, 부모가 다른 경우 union을 시켜주는 거였다. 

 

즉, union하기 전에 부모가 같아야 사이클이 발생하는 거였다!!

728x90
반응형

댓글