baekjoon
[백준] 1717 집합의 표현
윤만석
2023. 3. 20. 15:49
문제
초기에 �+1 개의 집합 {0},{1},{2},…,{�} 이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 � , � 이 주어진다. � 은 입력으로 주어지는 연산의 개수이다. 다음 � 개의 줄에는 각각의 연산이 주어진다. 합집합은 0 � � 의 형태로 입력이 주어진다. 이는 � 가 포함되어 있는 집합과, � 가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 � � 의 형태로 입력이 주어진다. 이는 � 와 � 가 같은 집합에 포함되어 있는지를 확인하는 연산이다.
출력
1로 시작하는 입력에 대해서 � 와 � 가 같은 집합에 포함되어 있으면 "YES" 또는 "yes"를, 그렇지 않다면 "NO" 또는 "no"를 한 줄에 하나씩 출력한다.
유니온 파인드 문제입니다.
a와 b를 합치면 a의 부모와 b의 부모중 작은값을 연결합니다.
#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false),cin.tie(NULL);
#define mset(v) memset(v,0,sizeof(v));
#define rep(i,a) for(int i=0;i<a;++i)
#define REP(i,a) for(int i=1;i<=a;++i)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef tuple<int, int, int>ti;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
int dy[] = { -1,0,1,0 }, dx[] = { 0,1,0,-1 };
int n, m, r[1000001];
int p(int k) {
return r[k] == k ? k : r[k]=p(r[k]); //주의 시간초과
}
void merge(int a, int b) {
int A(p(a)), B(p(b));
A > B ? r[A] = B : r[B] = A;
}
void query(int a, int b) {
p(a) == p(b) ? printf("YES\n") : printf("NO\n");
}
int main() {
FAST;
int x, a, b;
cin >> n >> m;
rep(i, n + 1)r[i] = i;
while (m--) {
cin >> x >> a >> b;
x == 0 ? merge(a, b) : query(a, b);
}
}