PS/BOJ
백준 1976번: 여행 가자 (C++)
도비(Doby)
2022. 3. 19. 18:57
https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
Solved By: Union-Find
#include <iostream>
#include <vector>
#define MAX 201
#define pii pair<int, int>
using namespace std;
vector<pii> edges;
vector<int> trip;
int parent[MAX];
int n, m;
int getRoot(int node){
if(node == parent[node]) return node;
else return parent[node] = getRoot(parent[node]);
}
void unionNodes(int a, int b){
int rA = getRoot(a);
int rB = getRoot(b);
if(rA > rB){
parent[rB] = rA;
}
else{
parent[rA] = rB;
}
}
bool find(int a, int b){
int rA = getRoot(a);
int rB = getRoot(b);
if(rA != rB) return 1;
else return 0;
}
int main(){
cin >> n >> m;
bool a;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
cin >> a;
if(a == 1){
edges.push_back({i, j});
}
}
}
for(int i = 1; i <= n; i++) parent[i] = i;
for(int i = 0; i < edges.size(); i++){
unionNodes(edges[i].first, edges[i].second);
}
for(int i = 0; i < m; i++){
int q; cin >> q;
trip.push_back(q);
}
bool check = 1;
for(int i = 1; i < trip.size(); i++){
if(find(trip[i - 1], trip[i])) check = 0;
}
if(check == 0) cout << "NO";
else cout << "YES";
return 0;
}