문제 링크: https://oj.uz/problem/view/KAISTRUN26SPRING_F
지난 RUN 봄대회에 출제된 ibm2006의 문제다. 정해가 매우 아름다워 풀이 공개 시간에 박수를 받은 문제이기도 하여 소개한다.
문제
정점이 개인 그래프 와 인 양의 정수 가 주어진다. 이때 아래 둘 중 하나를 찾아라.
- 크기가 인 . 단, 와 사이에는 간선이 없다.
- -subgraph
풀이
위에서의 DFS 과정을 생각하는데, 각 정점이 방문되는 순서만 보는 것이 아니라 정점에 방문하거나 탐색을 끝나고 정점에서 돌아 나오는 각 과정을 한 단위 시간으로 생각하자(말을 한 칸씩 이동한다고 보면 된다). 이때 각 시간마다 아래 세 집합을 정의할 수 있다.
- 한 번도 방문되지 않은 정점의 집합
- 방문되었으나 아직 탐색이 끝나고 돌아 나오지 않은 정점의 집합
- 탐색이 끝나고 돌아 나온 정점의 집합
이때 쉽게 관찰 가능한 정보는 다음과 같다.
- 와 사이에 간선이 있다면 해당 간선을 남긴 채로 의 정점에서 탐색이 끝났다는 뜻이 되므로 모순이다. 따라서 와 사이에는 간선이 없다.
- 는 현재 DFS 진행 과정 중에 ‘살아 있는’ 줄기이므로 시작점으로부터의 path를 이룬다.
- 새로운 정점에 방문할 때는 의 크기가 1 줄고, 정점에서 돌아 나올 때는 의 크기가 1 늘어난다.
- DFS가 시작하기 전에는 이며 DFS가 끝난 후에는 이다.
3번과 4번의 관찰을 통해 인 시점이 존재함을 알 수 있다. 이때 라고 하자. 만약 라면, 와 의 크기 인 임의의 부분집합을 택하여 로 둘 수 있다. 이때 1번 관찰에 의해 와 는 올바른 답이 된다. 만약 라면, 이다. 2번 관찰에 의해 는 -subgraph를 가짐을 알 수 있다.
구현은 매우 짧은 편이다. 구현 시 주의할 점은 가 connected라는 조건이 없기 때문에 각 component에 대해서 DFS를 돌리면서 , , 는 global하게 관리해야 한다는 점이다.
댓글
아직 작성된 댓글이 없습니다.