[백준] 1976번: 여행 가자

2022. 9. 12. 16:00TIL💡/Algorithms

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

 

1976번: 여행 가자

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

www.acmicpc.net

처음에 문제 초반만 보면 최소 스패닝 트리 등 탐색을 해야하나 싶지만 그렇지 않다.

각 도시의 연결성만 확인하면 되므로 유니온 파인드 알고리즘을 사용하였다.

 

이 때 parent 갱신을 주의하면 무난하게 풀 수 있는 문제이다.

 

#include <iostream>

using namespace std;
int city[201][201];
int parents[201];

int Find(int idx) {
    if(idx == parents[idx]) {
        return idx;
    }
    return parents[idx] = Find(parents[idx]);
}

void Union(int a, int b) {
    int parent_a = Find(a);
    int parent_b = Find(b);
    
    if(parent_a == parent_b) return;
    
    if(parent_a < parent_b) {
        parents[parent_b] = parent_a;
    }
    else {
        parents[parent_a] = parent_b;
    }
}
int main() {
    int N, M;
    
    cin >> N >> M;
    for(int i = 1;i <= N;i++) {
        parents[i] = i;
    }
    
    for(int i = 1;i <= N;i++) {
        for(int j = 1;j <= N;j++) {
            cin >> city[i][j];
        }
    }

    
    for(int i = 1;i <= N;i++){
        for(int j = 1;j < i;j++) {
            if(city[i][j]) {
                Union(i, j);
            }
        }
    }
    
    bool linked = true;
    int a, b;
    cin >> a;
    for(int i = 0;i < M - 1;i++) {
        cin >> b;

        if(Find(a) != Find(b)) {
            linked = false;
            break;
        }
        a = b;
    }
    
    if(linked) {
        cout << "YES" << '\n';
    }
    else {
        cout << "NO" << '\n';
    }
}

'TIL💡 > Algorithms' 카테고리의 다른 글

[백준] 9655번: 돌 게임  (0) 2022.09.17
[백준] 1927번: 최소 힙  (0) 2022.09.12
[백준] 2467번: 용액  (0) 2022.09.12
[백준] 1446번: 지름길  (0) 2022.09.12
[백준] 1, 2, 3 더하기 4  (0) 2022.09.12