본문 바로가기
알고리즘/백준 문제

1976 - 여행 가자

by HDobby 2023. 8. 9.

https://www.acmicpc.net/problem/1976

 

1976번: 여행 가자

동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인

www.acmicpc.net

생각해보기

  • N이 200으로 굉장히 작기 때문에 플로이드 와샬로 모든 경로가 가능한지를 구해서도 해결이 가능하다.
  • 유니온 파인드를 이용하여 모든 방문 도시의 부모가 같은지를 확인해도 해결 가능하다.

코드

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int N, M;
int dist[201][201];
int chk[201];
vector<int> cities;

void input(){
    cin>>N>>M;

    cities.resize(M);
    for(int i=1;i<=N;++i){
        chk[i]=i;
        for(int j=1;j<=N;++j){
            cin>>dist[i][j];
        }
    }
    for(int i=0;i<M;++i){
        cin>>cities[i];
    }
}

int findf(int num){
    if(num != chk[num])
        chk[num] = findf(chk[num]);
    return chk[num];
}

void unionf(int num1, int num2){
    num1 = findf(num1);
    num2 = findf(num2);

    chk[max(num1, num2)] = min(num1,num2);
}

bool calc(){
    int num = chk[cities[0]];
    for(int i=0;i<M;++i){
        if(num != chk[cities[i]])
            return false;
    }
    return true;
}

void solution(){
    for(int i=1;i<=N;++i){
        for(int j=1;j<=N;++j){
            if(dist[i][j]){
                unionf(i,j);
            }
        }
    }

    if(calc())
        cout<<"YES"<<'\n';
    else
        cout<<"NO"<<'\n';
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    input();
    solution();

    return 0;
}

728x90

'알고리즘 > 백준 문제' 카테고리의 다른 글

22251 - 빌런 호석  (0) 2023.08.07
1863 - 스카이라인 쉬운거  (0) 2023.08.06
2138 - 전구와 스위치  (0) 2023.08.06
7682 - 틱택토  (0) 2023.08.04
2467 - 용액  (0) 2023.08.02

댓글