문제

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

 

주안점

n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)

n과 m의 범위가 커 유니온 파인드를 사용하지 않는다면 시간초과가 나온다.

 

구조

유니온 파인드를 이용한 기본적인 구조

 

 

코드
#include<bits/stdc++.h>
using namespace std;

int n,m,t,a,b;
int p[1000001];

int finnd(int n){
    if(p[n]<0) return n;
    p[n] = finnd(p[n]);
    return p[n];
}

void merge(int a, int b){
    a = finnd(a);
    b = finnd(b);
    if(a==b) return;
    p[b] = a;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin>>n>>m;
    fill(p, p+n+1, -1);
    for(int i=0; i<m; i++){
        cin>>t>>a>>b;
        if(t) {
            cout<<(finnd(a)==finnd(b) ? "YES" : "NO")<<"\n";
        }
        else merge(a,b);
    }
}

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

[백준] 14716번 : 현수막  (0) 2021.12.15
[백준] 2292번 : 벌집  (0) 2021.12.01
[백준] 2636번 : 치즈  (0) 2021.11.09
[백준] 회의실 배정  (0) 2021.11.04
[백준] 부녀회장이 될테야  (0) 2021.11.03

+ Recent posts