코테연습일지/그래프 이론

10775 공항 (Union Find)

jemin0619 2024. 4. 15. 10:35

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

 

10775번: 공항

예제 1 : [2][?][?][1] 형태로 도킹시킬 수 있다. 3번째 비행기는 도킹시킬 수 없다. 예제 2 : [1][2][3][?] 형태로 도킹 시킬 수 있고, 4번째 비행기는 절대 도킹 시킬 수 없어서 이후 추가적인 도킹은 불

www.acmicpc.net

 

유니온 파인드로 이런게 가능할지 몰랐다.

Set을 사용한 풀이가 더 직관적인 것 같긴 하지만 유니온파인드가 조금 더 편한 느낌이 있다.

 

풀이는 다음과 같다.

1. parent 배열 초기화.

2. 값 x를 입력받으면 find(x)와 find(x-1)을 merge.     (2-1. 이 때 find(x)의 부모가 find(x-1)인 구조가 되어야 한다.)

     (2-2. merge 할 때마다 ans++)

3. 만약 find(x)가 0이면 자리가 없다는 의미이므로 break;

4. cout<<ans;

 

더보기
#include<bits/stdc++.h>
using namespace std;

int parent[100'003];
int ans;

int find(int cur){
    if(cur==parent[cur]) return cur;
    return parent[cur]=find(parent[cur]);
}

void merge(int u, int v){
    u=find(u); v=find(v);
    if(u==v) return;
    parent[v]=u; //u에 v를 붙인다.
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int p,g; cin>>p>>g;
    for(int i=1;i<=p;i++) parent[i]=i;
    while(g--){
        int x; cin>>x;
        if(find(x)==0) break;
        merge(find(x)-1,find(x));
        ans++;
    }
    cout<<ans;
    return 0;
}