Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- BOJ14501
- DP
- boj
- 백준 #BOJ #1697
- 색종이와가위
- 백준2533
- BOJ1753
- 백준11404
- 1520내리막길
- 재귀
- 백준2141
- github_actions
- BOJ14719
- BFS
- BOJ2110
- 백준2110
- 백준
- 프로그래머스 #무지의먹방라이브 #C++
- BOJ11729
- BOJ2629
- BOJ9663
- 백트래킹
- 생활코딩
- BOJ11404
- BOJ20444
- html
- 이분탐색
- BOJ11066
- BOJ2805
- BOJ1931
Archives
- Today
- Total
poksul_log
# 1976. 여행 가자 본문
관련 알고리즘 : 유니온 파인드
문제 링크 : https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
해결 방법
동혁이가 여행 계획을 위해 이동해야 하는 최단 거리를 구하는 것이 아니라, 같은 곳을 여러 번 경유한다 해도 도시들을 순서에 따라 여행할 수 있을 지에 대한 여부를 구하는 것이기 때문에 유니온 파인드를 사용하였다.
같은 그래프에 여행 계획을 세운 도시들이 모두 포함되어 있다면 경유하여 갈 수 여행할 수 있다는 뜻이므로 yes를,
도시들 중 하나라도 다른 그래프에 포함되어 있다면 경유하여 여행할 수 없다는 뜻이므로 no를 반환한다.
유니온 파인드에 대한 개념이 부족하여 관련 블로그
유니온 파인드(Union-Find)
유니온 파인드란? 유니온 파인드는 그래프 알고리즘으로 두 노드가 같은 그래프에 속하는지 판별하는 알고리즘이다. 서로소 집합, 상호 베타적 집합(Disjoint-Set)으로도 불린다. 노드를 합치는 Unio
ip99202.github.io
를 참고하였다.
C++ 코드
#include <iostream>
using namespace std;
int n; // 도시 수
int m; // 여행 계획에 속한 도시 수
int parent[201];
int find(int i)
{
if (parent[i] == i) // 공통 부모 합집합x 혹은 이 값 자체가 공통부모
return i;
parent[i] = find(parent[i]); // 공통 부모 다시 찾기
return parent[i];
}
void merge(int a, int b)
{
// 공통 부모 합집합 찾아내기
a = find(a);
b = find(b);
if (a < b)
parent[b] = a; // 공통 부모 합집합으로 묶어주기
else
parent[a] = b;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
parent[i] = i; // 처음 입력받을 시, 모든
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int tmp;
cin >> tmp;
if (tmp == 1)
merge(i, j); // 인접한 도시들끼리 한 집합으로 합치기
}
}
bool check = true;
int root;
cin >> root;
int r = find(root);
for (int i = 0; i < m - 1; i++) // m개 도시들이 같은 집합 내에 속해 있는지 확인
{
int t;
cin >> t;
if (r != find(t)) // 하나라도 같은 집합이 없을 때
check = false; // 여행 불가
}
if (check)
cout << "YES\n";
else
cout << "NO\n";
return 0;
}
'Coding Test > BOJ' 카테고리의 다른 글
# 15961. 회전 초밥 (0) | 2023.02.05 |
---|---|
# 1753. 최단경로 (0) | 2023.01.29 |
# 1092. 배 (0) | 2022.11.06 |
# 11265. 끝나지 않는 파티 (0) | 2022.10.09 |
# 1062. 가르침 (0) | 2022.10.02 |