여행 가자 1976

PublicMinsu·2023년 3월 16일
0

문제

접근 방법

여행 경로로 선택된 도시들이 연결됐는지 확인하는 문제이다.
유니온 파인드를 활용하여 연결됨을 표시해주면 된다.

코드

#include <iostream>
using namespace std;
int parents[201];
int find(int num)
{
    if (parents[num] == num)
        return num;
    return parents[num] = find(parents[num]);
}
void merge(int num1, int num2)
{
    int x = find(num1);
    int y = find(num2);
    if (x > y)
    {
        parents[x] = y;
    }
    else
    {
        parents[y] = x;
    }
}
int main()
{
    ios::sync_with_stdio(0), cin.tie(0);
    int N, M, k;
    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 >> k;
            if (k)
                merge(i, j);
        }
    }
    cin >> k;
    int group = parents[k];
    for (int i = 2; i <= M; ++i)
    {
        cin >> k;
        if (parents[k] != group)
        {
            cout << "NO";
            return 0;
        }
    }
    cout << "YES";
}

풀이

유니온 파인드를 활용해 연결된 도시들을 하나의 그룹으로 만들어준다. 이후 여행 경로를 확인할 때 처음 받는 값으로 어떤 그룹에 속한지 확인하고 나머지 그룹도 같은 그룹 안에 있는지 확인해준다.

profile
연락 : publicminsu@naver.com

0개의 댓글