그냥 블로그

[C++/백준] 20040 사이클 게임 본문

C++/백준

[C++/백준] 20040 사이클 게임

코딩하는 공대생 2024. 1. 13. 17:05
반응형
 

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