코딩성장스토리

백준 1717번:집합의 표현 본문

백준 코딩

백준 1717번:집합의 표현

까르르꿍꿍 2022. 1. 19. 14:11

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

 

1717번: 집합의 표현

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

www.acmicpc.net

 

이 문제는 같은 집합에 있는지 아닌지만 파악하면 되므로 유니온 파인드를 이용했다.

그리고 입력 값이 많이 들어갈 것을 생각해서 

cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false); 

이것들을 추가 했다.

0이면 유니온 처리 해주고 1이면 루트노드를 비교해서 같으면 YES 아니면NO가 나오게 했다.

유니온 파인드만 알고 있으면 쉬운 문제다.

#include <iostream>
using namespace std;
int parent[1000001];
int find(int x){             //유니온 파인드
  if (x==parent[x]){
    return x;
  }
  else{
    int y = find(parent[x]);
    parent[x] = y;
    return y;
  }
}
void Union(int x,int y){
  x = find(x);
  y = find(y);
  parent[y] = x;
}
int main(){
    cin.tie(NULL);
	cout.tie(NULL);
	ios_base::sync_with_stdio(false);
    int n ,m;
    cin >>n>>m;
    for(int i=1;i<=n;i++){
        parent[i]=i;
    }
    while(m--){                     
        int input,a ,b;
        cin >>input>>a>>b;
        if(input ==0){              //0이면 합쳐준다
            Union(a,b);
        }
        if(input==1){
            if(find(a)==find(b)){                 //루트노드가 같으면 같은 집합이므로 YES
                cout <<"YES" <<'\n';
            }
            else{                                  //아니면 NO
                cout << "NO" << '\n'; 
            }
        }
    }

}

'백준 코딩' 카테고리의 다른 글

백준 2805번:나무 자르기  (0) 2022.01.21
백준 1654번:랜선 자르기  (0) 2022.01.20
백준 2606번: 바이러스  (0) 2022.01.18
백준 3015번 :오아시스 재결합  (0) 2022.01.17
백준 9935번: 문자열 폭발  (0) 2022.01.16