문제풀이/백준oj
[백준oj] 1976번 여행가자
Hyeon-Uk
2020. 12. 29. 00:57
반응형
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
이 문제는 그래프의 합집합을 이용하여 문제를 풀었다.
이어져 있는 도시들중 가장 낮은 도시로 부모를 설정을 해둔뒤, 마지막에 M개의 도시들의 부모 도시가 같으면 YES, 같지 않다면 NO를 출력하면된다.
#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
int arr[200][200] = { 0 };
vector<int> v;
int parent[200];
int getParent(int a) {
if (a == parent[a]) {
return a;
}
else {
return parent[a]=getParent(parent[a]);
}
}
void unionParent(int a, int b) {
a = getParent(a);
b = getParent(b);
if (a == b) return;
else {
if (a < b) {
parent[b] = a;
}
else {
parent[a] = b;
}
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
parent[i] = i;
}
//도시들 연결 관계 입력과 동시에 연결
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> arr[i][j];
if (arr[i][j] == 1) {
unionParent(i, j);
}
}
}
//여행할 도시들 저장
v.resize(m);
for (int i = 0; i < m; i++) {
cin >> v[i];
}
bool flag = true;//부모가 같은지를 저장하는 변수
for (int i = 0; i < m - 1; i++) {
//연결된 도시중 가장 작은 도시가 같지않으면 flag=false후 break
if (parent[v[i] - 1] != parent[v[i + 1] - 1]) {
flag = false;
break;
}
}
if (flag) cout << "YES";
else cout << "NO";
return 0;
}
반응형