728x90
반응형
https://www.acmicpc.net/problem/20040
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
반응형
'알고리즘 > 그래프' 카테고리의 다른 글
[java 백준] 2887번 행성터널 (1) | 2022.10.01 |
---|---|
[java 백준] 10775번 공항 (0) | 2022.09.10 |
[java 백준] 1043번 거짓말 (0) | 2022.08.20 |
[java 백준] 골드 4/ 1197번 최소스패닝 트리 (0) | 2022.07.10 |
[java 백준] 골드 3/ 1238번 파티 (0) | 2022.07.08 |
댓글