IT/BOJ 문제정리
백준 1976번: 여행 가자
KimCookieYa
2021. 8. 5. 15:13
https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
0. 알고리즘 분류
그래프 이론, 자료 구조, 그래프 탐색, 분리 집합
1. 문제
2. 풀이
유니온 파인드(Union-Find) 문제다. 그래프 문제이기도 하지만, 그냥 유니온 파인드에 익숙해지라고 준 문제인듯 하다. 그냥 풀면 된다.
3. 코드
#include <iostream>
using namespace std;
int p[201];
int find(int i) {
if (p[i] == 0) {
return i;
}
p[i] = find(p[i]);
return p[i];
}
void merge(int x, int y) {
x = find(x);
y = find(y);
if (x != y) {
p[max(x, y)] = min(x, y);
}
}
int max(int x, int y) {
return (x > y) ? x : y;
}
int min(int x, int y) {
return (x < y) ? x : y;
}
int main(void) {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int temp;
cin >> temp;
if (temp == 1) {
merge(i+1, j+1);
}
}
}
int visit[m];
for (int i = 0; i < m; i++) {
cin >> visit[i];
}
char* ans = "YES";
int root = find(visit[0]);
for (int i = 1; i < m; i++) {
if (root != find(visit[i])) {
ans = "NO";
}
}
cout << ans;
return 0;
}