여행 경로로 선택된 도시들이 연결됐는지 확인하는 문제이다.
유니온 파인드를 활용하여 연결됨을 표시해주면 된다.
#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";
}
유니온 파인드를 활용해 연결된 도시들을 하나의 그룹으로 만들어준다. 이후 여행 경로를 확인할 때 처음 받는 값으로 어떤 그룹에 속한지 확인하고 나머지 그룹도 같은 그룹 안에 있는지 확인해준다.