문제 링크 : www.acmicpc.net/problem/1717
응용없는 단순한 유니온 파인드(disjoint set)알고리즘이다.
<전체적인 알고리즘>
1-1. type이 0이면 두 노드들의 root를 합친다.
-> d배열에 각 노드들의 부모를 가리키도록 저장한다.(재귀로 끝까지 가보면 root가 나오게 됨)
1-2. type이 1이면 두 노드의 집합 여부를 출력한다. (root노드가 같으면 결국 같은 집합임)
<전체 코드>
#include<iostream>
using namespace std;
int d[1000002];
int find_root(int a) //해당 집합의 root 찾아서 반환
{
if (d[a] == a)return a;
return find_root(d[a]);
}
void make_union(int a, int b) //두 집합 하나로 합치기
{
a = find_root(a);
b = find_root(b);
if (a < b)d[b] = a;
else d[a] = b;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
d[i] = i;
}
for (int i = 0; i < m; i++)
{
int type, n1, n2;
cin >> type >> n1 >> n2;
if (type == 0)
{
if (find_root(n1) != find_root(n2))make_union(n1, n2); //다른집합이면 합치기
}
else
{
if (find_root(n1) == find_root(n2))cout << "YES\n";
else cout << "NO\n";
}
}
return 0;
}
궁금하신 점은 댓글에 남겨주시면 답변드리겠습니다.
반응형
'백준 사이트 코딩 문제 > 그 외 문제' 카테고리의 다른 글
백준 9663번: N-Queen (C++) (0) | 2020.11.17 |
---|---|
백준 1753번: 최단경로 (C++) (0) | 2020.11.17 |
백준 1167번: 트리의 지름 (C++) (0) | 2020.11.13 |
백준 12865번: 평범한 배낭 (C++) (0) | 2020.11.12 |
백준 7569번: 토마토 (C++) (0) | 2020.09.11 |