출처 : 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 |
