Problem Solving/BOJ

[백준 / BOJ] C++ 1976 여행 가자

nageune 2023. 3. 28. 14:32
728x90
반응형

1976번: 여행 가자

 

문제

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

 

1976번: 여행 가자

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

www.acmicpc.net

 

 

풀이

인접 행렬을 입력받아 인접한 도시끼리 union 시켜준 다음 여행 계획에 포함되어 있는 도시들이 모두 같은 집합 안에 있는지 즉, find 값이 모두 같은지 확인하면 된다.

 

 

코드

#include <bits/stdc++.h>
using namespace std;

vector<int> p;

int find(int x) {
  if (p[x] != x)
    p[x] = find(p[x]);
  return p[x];
}

void merge(int x, int y) {
  x = find(x);
  y = find(y);
  if (x < y)
    p[y] = x;
  else
    p[x] = y;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m;
  cin >> n >> m;
  p.resize(n + 1);
  iota(p.begin(), p.end(), 0);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      int x;
      cin >> x;
      if (x == 1)
        merge(i, j);
    }
  vector<int> v(m);
  for (int i = 0; i < m; i++)
    cin >> v[i];
  int x = find(v[0]);
  string ans = "YES";
  for (int i = 1; i < m; i++)
    if (x != find(v[i]))
      ans = "NO";
  cout << ans;
  return 0;
}

 

728x90
반응형