아무코딩

[백준 1717] 집합의 표현 (c++) 본문

알고리즘/백준

[백준 1717] 집합의 표현 (c++)

동 코 2020. 5. 21. 20:23

문제풀이

union-find를 이용한 문제입니다. paraent를 자기자신으로 초기화 한뒤 계속 한쪽을 붙여주며 붙여주고나서는 parent를 가리키는 방식입니다. 

 

간단한 방식이고 더 효율적으로 푸려면 자식이 많은 트리에 계속 붙여나가고 루트노드에 바로 직접 자식이 붙어있도록 최적화를 한다면 더 빨라 질것 같으나 

 

해당문제에서는 그정도 까지는 필요없다고 판단하여 이렇게 풀었습니다.

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
#include <stdio.h>
 
using namespace std;
 
int N,M;
 
int parent[1000001];
 
 
void initSet(){
    for(int i=0;i<=N;i++)
        parent[i] = i;
}
 
int find(int num){
    if (num == parent[num])
        return num;
    else{
        parent[num] = find(parent[num]);
        return parent[num];
    }
}
 
int main() {
    scanf("%d %d",&N,&M);
    initSet();
    for(int i=0;i<M;i++){
        int mode,num1,num2;
        scanf("%d %d %d",&mode,&num1,&num2);
        if(mode==0){
            num1 = find(num1);
            num2 = find(num2);
            if(num1!=num2)
                parent[num2]=num1;
        }
        else{
            num1 = find(num1);
            num2 = find(num2);
            if(num1==num2)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    
    return 0;
}
 
cs
 
 

문제 링크 : https://www.acmicpc.net/problem/1717

 

1717번: 집합의 표현

첫째 줄에 n(1≤n≤1,000,000), m(1≤m≤100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 ��

www.acmicpc.net

 

Comments