문제 : https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
문제 요약 : 사이클이 형성된 라운드 출력
입력 | 출력 |
3 ≤ N(점의 개수) ≤ 500000 3 ≤ M(라운드 수) ≤ 1000000 |
주어진 입력에서 사이클이 형성된 라운드 출력 (사이클이 형성되지 않았을 경우 0 출력) |
JAVA
소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_20040.java
채점 번호 | 아이디 | 문제 번호 | 결과 | 메모리 | 시간 | 언어 | 코드 길이 |
31129822 | cbkpar | 20040 | 맞았습니다!! | 125468KB | 700ms | Java 11 | 1034B |
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] parent;
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n,m,i,a,b,x,y;
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
parent = new int[n];
for(i=0;i<n;i++) parent[i] = i;
for(i=1;i<=m;i++) {
st = new StringTokenizer(br.readLine());
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
a = find(x);
b = find(y);
if(a==b) {
System.out.println(i);
return;
}
union(x,y);
}
System.out.println("0");
}
static int find(int x) {
if(parent[x]==x) return x;
return find(parent[x]);
}
static void union(int x, int y) {
x = find(x);
y = find(y);
if(x<y) {
parent[y] = x;
}else {
parent[x] = y;
}
}
}
find 함수를 이용해 두 수의 부모가 같다면 사이클이 형성된 것이므로 해당 라운드를 출력한다.
그렇지 않을 경우 find 함수를 이용해 두 수의 부모를 구하고 큰 값의 부모를 작은 값으로 수정해준다.
'백준온라인' 카테고리의 다른 글
[백준온라인] 2546번 경제학과 정원영 (0) | 2021.08.03 |
---|---|
[백준온라인] 17404번 RGB거리 2 (0) | 2021.08.02 |
[백준온라인] 9252번 LCS 2 (0) | 2021.07.31 |
[백준온라인] 2467번 용액 (0) | 2021.07.30 |
[백준온라인] 1248번 맞춰봐 (0) | 2021.07.29 |