본문 바로가기

알고리즘/BOJ

1717. 집합의 표현

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

 

1717번: 집합의 표현

첫째 줄에 n(1≤n≤1,000,000), m(1≤m≤100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a

www.acmicpc.net

Union-Find를 쓰면 간단히 해결된다.

<JAVA>

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

class Main {
	static int N, M;
	static int p[] = new int[1000001];

	static int find(int n) {
		if (p[n] == n)
			return n;
		else
			return p[n] = find(p[n]);
	}

	static void union(int x, int y) {
		x = find(x);
		y = find(y);
		if (x == y)
			return;
		p[x] = y;
	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken(" "));
		M = Integer.parseInt(st.nextToken(" "));
		for (int i = 0; i <= N; i++) {
			p[i] = i;
		}
		for (int i = 0; i < M; ++i) {
			st = new StringTokenizer(br.readLine(), " ");
			switch (Integer.parseInt(st.nextToken(" "))) {
			case 0:
				union(Integer.parseInt(st.nextToken(" ")), Integer.parseInt(st.nextToken(" ")));
				break;
			case 1:
				if (find(Integer.parseInt(st.nextToken(" "))) == find(Integer.parseInt(st.nextToken(" ")))) {
					System.out.println("YES");
				} else {
					System.out.println("NO");
				}
				break;
			}
		}
	}
}

<C++>

#include<iostream>
using namespace std;
int N, M;
int map[1000001];
int find(int n) {
	if (map[n] == n)
		return n;
	else
		return map[n] = find(map[n]);
}
void _union(int x, int y) {
	x = find(x);
	y = find(y);
	if (x == y)
		return;
	map[x] = y;
}

int main() {
	cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
	int temp, p, q;
	cin >> N >> M;
	for (int i = 0; i <= N; i++) {
		map[i] = i;
	}
	for (int i = 0; i < M; ++i) {
		cin >> temp >> p >> q;
		switch (temp) {
		case 0:
			_union(p, q);
			break;
		case 1:
			if (find(p) == find(q)) {
				cout << "YES\n";
			}
			else {
				cout << "NO\n";
			}
			break;
		}
	}
	return 0;
}

'알고리즘 > BOJ' 카테고리의 다른 글

14889. 스타트와 링크  (0) 2019.10.15
16235. 나무재테크  (0) 2019.10.15
13460. 구슬 탈출 2  (0) 2019.10.15
1157. 단어 공부  (0) 2019.10.08
4963. 섬의 개수  (0) 2019.10.07