반응형
이번문제는 도시와 도시간 연결 정보를 알고 있으면, 중간에 다른 도시를 경유해서라도, 원하는 도시들을 여행할 수 있는지를 알아보는 것입니다.
사실 이 문제는 그래프를 만들어서 DFS나 BFS를 통해서 원하는 도시들을 다 방문하는지 찾아보아도 됩니다.
저는 배타적 집합(Disjoint Set)을 이용했습니다. 배타적 집합에서 집합을 찾고 합집합을 하는 것이 모두 상수시간이 걸리기 때문에, 전체적으로 \(O(N^2)\)의 알고리즘 효율로 할 수 있습니다.
연결된 도시가 나타나면, 각각의 도시가 속한 집합을 합집합을 하게 됩니다. 그러면 서로 분리된 한개 이상의 집합들이 나오게 되는데, 여행하고자 하는 도시들이 같은 집합에 있는지 검사하면 됩니다.
제가 작성한 소스입니다.
//------------------------------------------------
// baekjoon #1976 - Let's go a trip
// - by Aubrey Choi
// - created at 2019-07-10
//------------------------------------------------
#include <stdio.h>
int getroot(int set[], int n)
{
if(set[n] == n) return n;
return set[n] = getroot(set, set[n]);
}
int main()
{
int n, m, s, set[201] = {0, };
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) set[i] = i;
for(int i = 1; i <= n; i++)
{
int a = getroot(set, i);
for(int j = 1; j <= n; j++)
{
scanf("%d", &s);
if(j <= i || s == 0) continue;
int b = getroot(set, j);
if(a != b) set[b] = a;
}
}
scanf("%d", &s);
int r = getroot(set, s);
while(--m)
{
scanf("%d", &s);
if(getroot(set, s) != r) break;
}
puts(m ? "NO" : "YES");
}
728x90
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #1981 배열에서 이동(이분탐색) (0) | 2023.01.02 |
---|---|
[C/C++] 백준 #1978 소수 찾기(수학) (0) | 2022.12.20 |
[C/C++] 백준 #1966 프린터 큐(구현) (0) | 2022.12.14 |
[C/C++] 백준 #1965 상자넣기(가장 긴 증가하는 부분수열) (0) | 2022.12.10 |
[C/C++] 백준 #1963 소수 경로(너비 우선 탐색) (2) | 2022.12.09 |
댓글