Doby's Lab

백준 1976번: 여행 가자 (C++) 본문

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;
}
728x90