티스토리 뷰
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
아이디어: 매번 DFS돌리며 사이클을 검출하려면 TLE가 발생하니 각 노드를 하나의 집합으로 두고 같은 집합끼리 묶으려 하면 사이클임을 알 수 있다.
결국 DFS가 아닌 Union-find를 쓰는 문제이나,
노드의 숫자인 N= 500,000이며 merge시행 횟수인 M= 1,000,000 이므로 O(N)으로 Union-find를 하면 TLE
따라서 find과정에서 만나는 과정마다 부모를 최상위 노드로 설정해가며 O(logN)으로 만들 필요가 있었다.
int find(int cur){
if(uni[cur]==cur)return cur;
// 경로압축을 위해 만나는 노드마다 부모를 자신의 최상위 노드로 설정
else return uni[cur]=find(uni[cur]);
}
find를 통하여 최상위 노드를 알아낸 뒤, 크기를 비교하여 작은 쪽을 큰 쪽으로 붙여주면 끝.
이를 모든 경로상에 대하여 진행하여주고 find(a) == find(b)라면 같은 유니언끼리 붙이려하는 상황이니 횟수 출력 후 종료를 하면된다.
'Algorithms & PS' 카테고리의 다른 글
[short] 최소공통조상 알고리즘 (Longest Common Ancestor) (0) | 2021.11.23 |
---|---|
[최소 스패닝 트리] 프림 알고리즘 (0) | 2021.11.16 |
[2668] 숫자고르기 (0) | 2021.11.15 |
[22991] 수요응답형 버스 (박제용) (2) | 2021.10.18 |
선분 교차 판별법 (0) | 2021.08.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday