일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코딩테스트
- leetcode
- 완전탐색
- 문자열&연산자
- 백트래킹
- 메모리 배리어
- Algorithm
- 제로베이스 프론트엔드 스쿨
- 프로그래머스
- 코딩테스트 스터디
- 멀티스레드
- map
- 알고리즘
- N과 M(2)
- dfs
- C++
- socket
- BFS
- React
- Server
- JavaScript
- 구조체
- 백준
- 구현
- 프론트엔드 스쿨
- 자바스크립트
- 서버
- c#
- MemoryBarrier
- 제로베이스
- Today
- Total
Written
백준 / 1976 / 여행 가자 / C++ / Union Find 알고리즘 본문
https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
이번 문제의 핵심은 '연결되어있기만 하다면' 다른 곳을 통하여 목적지까지 갈수 만 있으면 되는 것 입니다.
그래프의 연결관계를 확인하고 싶을 때, 사용되는 Union Find알고리즘으로 문제를 풀어보았습니다.
입력으로 주어지는 정보를 바탕으로 두 도시가 연결되어있다면 Union함수를 통해 이어주고, 마지막으로
답을 구하기 위한 최종 여행 루트의 연결관계를 파악해서 그 중 하나의 도시라도 이어져있지 않은 도시가
존재한다면 No를 출력하고 모두가 연결되어 있다면 어떻게든 다 순회할 수 있기 때문에 Yes를 출력합니다.
처음에 myParent행렬에서 부모노드를 자기 자신으로 초기화하여 설정하고, 입력으로 주어지는 정보에서
1 , 즉 연결되었음을 알려줄 때 Union함수를 통해 두 도시를 같은 집합으로 묶어줍니다. 예제 입력에서
(1,2)의 값이 1로 주어졌는데 , 둘의 부모노드의 값이 다르기 때문에 Union을 통해 연결해주고 (2,1)에서는
이미 연결되어 있음을 알기 때문에 Union함수에서 return을 만나 연결해줄 필요없이 함수가 종료하게 됩니다.
그 후에 마지막 줄인 여행의 최종 루트를 destList라는 배열에 넣고, 첫번째 원소의 값을 Find함수를 통해
부모노드의 값을 받아오고 다음 원소들 부터 차례대로 Find함수를 통해 부모노드를 찾아 하나라도 다른 값이
존재한다면 서로 다른 집합 , 즉 이어져 있지 않다는 것을 의미하기 때문에 No를 출력하고 모두 다 같은 부모노드를
갖는다면 , 즉 같은 집합에 속해있다면 모든 목적지 방문이 가능하기 때문에 Yes를 출력합니다.
★틀린 내용이 있을수 있습니다 ! 댓글로 언제든 수정해주시면 감사하겠습니다. 또한 , 질문 주시는 부분은 제가 아는 선에서 성심성의껏 답변드리겠습니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include <iostream>
#include <vector>
using namespace std;
int N, M;
int destList[1000];
int adjArr[201][201];
int myParent[201];
int findNode(int x)
{
if (myParent[x] != x)
{
return findNode(myParent[x]);
}
else
return myParent[x];
}
void uinonNode(int x, int y)
{
x = findNode(x);
y = findNode(y);
if (x == y)
return;
if (x < y)
myParent[y] = x;
else
myParent[x] = y;
}
int main()
{
cin >> N >> M;
for (int i = 1; i <= N; i++)
{
myParent[i] = i;
}
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
cin >> adjArr[i][j];
if (adjArr[i][j] == 1)
uinonNode(i, j);
}
}
for (int i = 0; i < M; i++)
{
cin >> destList[i];
}
int oneValue = findNode(destList[0]);
for (int i = 1; i < M; i++)
{
if (oneValue != findNode(destList[i]))
{
cout << "NO" << endl;
return 0;
}
}
cout << "YES" << endl;
return 0;
}
|
cs |
'알고리즘 문제풀이' 카테고리의 다른 글
백준 / 2606 / 바이러스 / C++ / 알고리즘 문제풀이 (Union - Find) (0) | 2022.11.30 |
---|---|
백준 / 2606 / 바이러스 / C++ / 알고리즘 문제풀이 (0) | 2022.11.29 |
백준 / 4485 / 녹색 옷 입은 애가 젤다지? / 다익스트라 알고리즘 / C++ (0) | 2022.11.25 |
백준 / 2178 / 미로 탐색 / C++ / 알고리즘 문제풀이 / BFS (2) | 2022.11.19 |
백준 / 7576 / 토마토 / 알고리즘 문제풀이 / C++ (0) | 2022.11.01 |