BOJ 1741 - 반 나누기

image.png

이 문제는 사실상 O(N2)O(N^2)개의 간선이 존재할 때 연결 그래프의 구성을 구하는 문제이다.

간선이 N(N1)/2MN(N-1) / 2-M 개가 있다고 보면 된다.

그러나 이건 너무 많기 때문에 일반적인 방법으로 구할 수 없다.

이런류의 문제들은 대개 그래프의 성질을 이용해서 시간복잡도를 특이하게 줄이는 방법을 고민해봐야 한다.

예를 들어, Small to Large 알고리즘 같은 느낌과 비슷한 것 같다.

그런식으로 접근했지만 쉽게 풀 수 없었다.


가장 간선의 개수가 작은 정점의 번호를 ss라고 하자.

ss가 가진 간선의 개수는 최대 O(M/N)O(M / N)이다. 그렇지 않다면 ss가 가장 간선이 적다는 것에 모순이다.

ss와 이어진 그룹을 BB, 간선으로 이어지지 않은 그룹을 AA라 하자.

ssAA의 모든 정점들과 DSU로 잇는다.

BB는 최대 O(M/N)O(M/N) 개의 정점이 있다.

BB에서 {s}+A\{s\} + A의 모든 정점들을 보고 간선이 연결되어있지 않은것이 있다면 이어준다. 이 과정이 O(MNNlogM)O(\dfrac MN \cdot N \log M) 이다.

BB에서 BB들 끼리 연결되지 않은 것이 있는지 완전 탐색으로 O(n(B)2)O(n(B)^2) 로 검사한다. 이 과정이 O((MN)2logM)O\Bigl( \left( \dfrac MN \right)^2 \log M\Bigr) 이다.

즉, 이렇게 특이하게 정점을 분리하고 시작하는 것으로 시간복잡도를 줄여 문제를 해결할 수 있다.

Tags:

Categories:

Updated:

Comments