본문으로 바로가기

백준 01976 - 여행 가자

category BOJ 백준/기타 2020. 11. 23. 17:27

출처 : https://www.acmicpc.net/problem/1976 

 

1976번: 여행 가자

동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인

www.acmicpc.net

 

고려사항

  • 유니온 파인드 구현.
  • findParent는 반복문으로도 가능.
    while( arr[city] != city ){
         city = arr[city];
    }
  • 유니온 함수가 중요!
    조사 중인 두 도시의 부모 도시를 구하고, 값이 더 작은 도시를 루트로 합친다!
    이 때 중요한 것은! 조사 중인 도시의 부모 배열을 수정하는 것이 아니라, ( 해도 되긴하지만 연산 이득이 크지 않음. )
    두 도시의 부모를 구했으면, 해당 부모들의 부모 배열을 고쳐야 한다! ( 그래야 나중에 같은 조상을 두고 있는지  조사가능 )

 

#include <iostream>
#include <algorithm>
using namespace std;

int findParent(int arr[], int city){
    if(arr[city] == city){
        return city;
    }

    return arr[city] = findParent(arr, arr[city]);
}

void unionParent(int arr[], int city1, int city2){
    int parent1 = findParent(arr, city1);
    int parent2 = findParent(arr, city2);

    if(parent1 < parent2){
        arr[parent2] = parent1;
    }else{
        arr[parent1] = parent2;
    }
}

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

    int parent[201], load[1000];
    int n, m, isConnect;

    cin>>n>>m;

    for(int i=1;i<=n;++i){
        parent[i] = i;
    }

    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            cin>>isConnect;
            if(i <= j && isConnect == 1){
                unionParent(parent, i, j);
            }
        }
    }

    for(int i=0;i<m;++i){
        cin>>load[i];
    }

    for(int i=1;i<m;++i){
        if(findParent(parent, load[i-1]) != findParent(parent, load[i])){
            cout<<"NO\n";
            return 0;
        }
    }

    cout<<"YES\n";
    return 0;
}

'BOJ 백준 > 기타' 카테고리의 다른 글

백준 04195 - 친구 네트워크  (0) 2020.11.26
백준 11438 - LCA 2  (0) 2020.11.25
백준 02108 - 통계학  (0) 2020.11.22
백준 01181 - 단어 정렬  (0) 2020.11.22
백준 02751 - 수 정렬하기 2  (0) 2020.11.20