백준 20040 '사이클 게임'

Bonwoong Ku·2023년 10월 31일
0

알고리즘 문제풀이

목록 보기
75/110

아이디어

  • 각 점을 분리집합으로 관리하자.
  • 분리집합을 합집합(union)할 때 서로 같은 집합에 합집합을 하게 된다면 사이클이 생기는 경우다.

코드

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

public class Main {
	static BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer tk = null;

	static int n, m;
	static int[] parent;
	
	public static void main(String[] args) throws Exception {
		tk = new StringTokenizer(rd.readLine());
		n = Integer.parseInt(tk.nextToken());
		m = Integer.parseInt(tk.nextToken());
		
		makeSet();
		
		for (int i=1; i<=m; i++) {
			tk = new StringTokenizer(rd.readLine());
			int a = Integer.parseInt(tk.nextToken());
			int b = Integer.parseInt(tk.nextToken());
			if (!union(a, b)) {
				System.out.println(i);
				return;
			}
		}
		
		System.out.println(0);
	}
	
	static void makeSet() {
		parent = new int[n];
		for (int i=0; i<n; i++)
			parent[i] = i;
	}
	
	static int findSet(int x) {
		if (parent[x] == x) return x;
		return parent[x] = findSet(parent[x]);
	}
	
	static boolean union(int x, int y) {
		int px = findSet(x);
		int py = findSet(y);
		if (px == py) return false;
		parent[px] = py;
		return true;
	}
}

메모리 및 시간

  • 메모리: 150212 KB
  • 시간: 536 ms

리뷰

  • Union-find 코드를 더 효율적인 것으로 외워놔야겠다.
profile
유사 개발자

0개의 댓글