초기에 개의 집합 이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
첫째 줄에 , 이 주어진다. 은 입력으로 주어지는 연산의 개수이다. 다음 개의 줄에는 각각의 연산이 주어진다. 합집합은 의 형태로 입력이 주어진다. 이는 가 포함되어 있는 집합과, 가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 의 형태로 입력이 주어진다. 이는 와 가 같은 집합에 포함되어 있는지를 확인하는 연산이다.
1로 시작하는 입력에 대해서 와 가 같은 집합에 포함되어 있으면 "YES" 또는 "yes"를, 그렇지 않다면 "NO" 또는 "no"를 한 줄에 하나씩 출력한다.
제한
, 는 정수
와 는 같을 수도 있다.
7 8
0 1 3
1 1 7
0 7 6
1 7 1
0 3 7
0 4 2
0 1 1
1 1 1
NO
NO
YES
유니온 방식으로 풀이하였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
    static int[] parent;
	static int n;
	static int m;
	
	static int findP(int x) {
		if(parent[x] != x) return parent[x] = findP(parent[x]);
		return parent[x];
	}
	
	static void union(int n1, int n2) {
		int p1 = findP(n1);
		int p2 = findP(n2);
		
		if(p1 < p2) {
			parent[p2] = p1;
		} else {
			parent[p1] = p2;
		}
	}
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		parent = new int[n+1];
		for(int i = 1; i <= n; i++) parent[i] = i;
		
		for(int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			int f = Integer.parseInt(st.nextToken());
			int m = Integer.parseInt(st.nextToken());
			int s = Integer.parseInt(st.nextToken());
			
			// 합집함 연산인 경우
			if(f == 0) {
				union(m, s);
			}
			else if(f == 1) {
				if(findP(m) == findP(s)) System.out.println("YES");
				else System.out.println("NO");
			}
		}
    }
}