본문으로 바로가기

백준 01976 - 여행 가자

category BOJ 백준기타 4년 전

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