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
- 자료구조
- dp
- 페이지교체알고리즘
- ESP32
- 1796
- REACT
- 2623
- 구현
- 3XN 타일링
- RBT
- TDD
- 데이터 링크 계층
- 메모리계층
- c++
- 구슬탈출
- 13459
- LOLIN D32
- Vite 사용 이유
- WebRTC란
- stl
- 적두트리
- tfjs
- 백준 2133
- TDD란?
- OpenVidu
- 테스트주도개발
- 백준
- mediastream
- 풀이
- 9996
Archives
- Today
- Total
그냥 블로그
[C++/백준] 20040 사이클 게임 본문
반응형
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
[풀이 과정]
문제랑 입력을 보고 union find로 사이클 여부를 구해주는 문제라는 걸 알 수 있었다. 지난주에 kruskal 하면서도 썼던거라 빠르게 파악할 수 있었다.
1. 입력받으면서 싸이클 여부를 파악한다.
2. find_Cycle 함수에서 각 점의 루트 노드 값을 구해주고, 그 값을 기반으로 사이클이 돌고 있는지 확인해준다.
두 점의 루트 노드 값이 같다면 사이클이 돌고 있는 것이다.
사이클이 돌고 있지 않다면 값이 작은 쪽으로 루트 노드 값을 변경시킨다.
3. 루트 노드 값을 찾아주는 함수 find_parent
종료 조건은 (n==node[n])으로 이 경우 본인이 루트 노드인 경우이다.
[코드]
#include<iostream>
#include<algorithm>
using namespace std;
int N, M;
int node[500002];
int find_parent(int n) {
if (n==node[n]) return n;
return node[n] = find_parent(node[n]);
}
int find_Cycle(int n1, int n2) {
int rootN1 = find_parent(n1);
int rootN2 = find_parent(n2);
if (rootN1 == rootN2) return 1;
if (rootN1 < rootN2) node[rootN2] = rootN1;
else node[rootN1] = rootN2;
return 0;
}
int main(){
cin >> N >> M;
for (int i = 0; i < N; i++) node[i] = i;
int ans = 0;
for (int i = 0; i < M; i++) {
int n1, n2;
cin >> n1 >> n2;
if (find_Cycle(n1, n2)) {
ans = i + 1;
break;
}
}
cout << ans;
return 0;
}
[++개인 보강]
값을 변경하는 부분에서 루트 값끼리 비교를 하고 변경해줘야 한다.
여기서 계속 n1, n2로 하는데 ㅠ 그럼 안됨.. ㅠㅠ
그런 경우에 1->2 3->4 1->4 2->3 이런 사이클을 하면 문제가 생김 ... 주의하도록....
반응형
'C++ > 백준' 카테고리의 다른 글
[C++/백준] 16724 피리 부는 사나이 (1) | 2024.01.22 |
---|---|
[C++/백준] 고층 건물 (0) | 2024.01.14 |
[C++/백준] 1647 도시분할계획 (1) | 2024.01.07 |
[C++/백준] 2143 두 배열의 합 (1) | 2023.12.29 |
[백준/C++] 보석 도둑 (0) | 2023.12.24 |