-
[BOJ] #1976 _ 여행 가자Problem Solving/BOJ 2019. 10. 20. 22:14
[여행가자] https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인지 알아보자. 물론 중간에 다른 도시를 경유해서 여행을 할 수도 있다. 예를 들어 도시가 5개 있고, A-B, B-C, A-D, B-D, E-A의 길이 있고, 동혁이의 여행 계획이 E C B C D 라면 E-A-B-C-B-C-B-D라는 여행경로를 통해 목적을 달성할
www.acmicpc.net
문제의 ABCDE의 연결 상태를 그래프로 나타내면 다음과 같다.
그래프를 보면, 모두 연결되어 있으며 최상위 부모 노드가 A로 동일하다.
따라서, 도시간에 연결되어 있는지 알기 위해서는 최상위 부모노드가 동일한지 판단하면 된다.
[ 소스 코드 ]
#include <cstdio> #include <vector> #include <algorithm> #define MAX 201 using namespace std; int N, M; int chk[MAX], map[MAX][MAX], tour[1000]; int findParent(int idx); int solve(); int main() { scanf("%d\n%d", &N, &M); for (int i = 1; i <= N; i++) chk[i] = i; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { scanf("%d", &map[i][j]); } } for (int i = 0; i < M; i++) scanf("%d", &tour[i]); int tmp_1, tmp_2; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (map[i][j]) { tmp_1 = findParent(i); tmp_2 = findParent(j); if (tmp_1 < tmp_2) chk[chk[j]] = tmp_1; else if (tmp_1 > tmp_2) chk[chk[i]] = tmp_2; } } } if (solve()) printf("YES\n"); else printf("NO\n"); return 0; } int findParent(int idx) { while (1) { if (idx == chk[idx]) return idx; idx = chk[idx]; } } int solve() { int cmp = findParent(tour[0]); for (int i = 1; i < M; i++) { if (cmp != findParent(tour[i])) return 0; } return 1; }
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] #12100 _ 2048(Easy) (0) 2019.10.20 [BOJ] #5373 _ 큐빙 (0) 2019.10.20 [BOJ] #17070 _ 파이프 옮기기1 (0) 2019.08.28 [BOJ] #14891 _ 톱니바퀴 (0) 2019.08.28 [BOJ] #14888 _ 연산자 끼워넣기 (0) 2019.08.28 댓글