13344 - Chess Tournament
- 알고리즘/문제풀이
- 2016. 11. 15. 03:05
문제 링크
https://www.acmicpc.net/problem/13344
문제 요약
수식이 주어졌을 때 주어진 수식들이 일관성이 있는지 혹은 모순이 있는지 찾아내는 문제다.
문제 풀이
수식은 크게 두가지 종류가 존재한다.
1. \(u = v\) : \(u\)와 \(v\)는 같다
2. \(u \gt v\) : \(u\)가 \(v\)보다 크다
만약 1번 수식이 없다고 생각을 해보자. 1번 수식이 없고 2번 수식만 있을 때 주어진 수식들이 일관성이 있는지 없는지 어떻게 판단을 할 수 있을까? \(u\)와 \(v\)가 나오고 \(\gt\)가 화살표 처럼 생겼으므로 \(u\)에서 \(v\)로 향하는 방향 그래프를 만들어 보자. 이 때 만약 \(Cycle\)이 있으면 어떻게 될까? \(Cycle\)이 존재하도록 수식을 만들려고 한다면 모순이 생길수 밖에 없다는 것을 쉽게 알 수 있다. 방향 그래프에서 싸이클의 존재 유무는 Cycle Detection Algorithm을 통해 쉽게 판단할 수 있다.
자 이제 남은 문제는 1번 수식들만 잘 처리한다면 우리는 이 문제를 해결할 수 있다. 동등한 위치에 있는 변수들을 어떻게 하면 효과적으로 관리할 수 있을까? 우리는 \(Disjoint\ set\)을 알고 있으므로 이를 활용한다면 효율적으로 1번 수식들을 처리할 수 있다는것을 알 수 있다.
최종적으로는 \(Disjoint\ set\)으로 1번 수식들을 전부 처리한다음 2번 수식들을 방향 그래프로 모델링한 뒤 싸이클의 존재 유무를 찾는 알고리즘을 설계할 수 있다. 우리는 \(O(N+M)\)의 시간복잡도로 이 문제를 해결할 수 있다.
소스 코드
'알고리즘 > 문제풀이' 카테고리의 다른 글
6241 - Dining (4) | 2016.11.16 |
---|---|
11670 - 초등 수학 (0) | 2016.11.16 |
1208 - 부분집합의 합 2 (0) | 2016.11.15 |
1867 - 돌멩이 제거 (1) | 2016.11.14 |
2843 - 마블 (1) | 2016.11.14 |