문제 링크: https://oj.uz/problem/view/KAISTRUN26SPRING_F

지난 RUN 봄대회에 출제된 ibm2006의 문제다. 정해가 매우 아름다워 풀이 공개 시간에 박수를 받은 문제이기도 하여 소개한다.

문제

정점이 nn개인 그래프 GGkn2k \leq \frac{n}{2}인 양의 정수 kk가 주어진다. 이때 아래 둘 중 하나를 찾아라.

  • 크기가 kkX,YV(G)X, Y \subseteq V(G). 단, XXYY 사이에는 간선이 없다.
  • Pn2k+2P_{n-2k+2}-subgraph

풀이

GG 위에서의 DFS 과정을 생각하는데, 각 정점이 방문되는 순서만 보는 것이 아니라 정점에 방문하거나 탐색을 끝나고 정점에서 돌아 나오는 각 과정을 한 단위 시간으로 생각하자(말을 한 칸씩 이동한다고 보면 된다). 이때 각 시간마다 아래 세 집합을 정의할 수 있다.

  • 한 번도 방문되지 않은 정점의 집합 AA
  • 방문되었으나 아직 탐색이 끝나고 돌아 나오지 않은 정점의 집합 BB
  • 탐색이 끝나고 돌아 나온 정점의 집합 CC

이때 쉽게 관찰 가능한 정보는 다음과 같다.

  1. AACC 사이에 간선이 있다면 해당 간선을 남긴 채로 CC의 정점에서 탐색이 끝났다는 뜻이 되므로 모순이다. 따라서 AACC 사이에는 간선이 없다.
  2. BB는 현재 DFS 진행 과정 중에 ‘살아 있는’ 줄기이므로 시작점으로부터의 path를 이룬다.
  3. 새로운 정점에 방문할 때는 AA의 크기가 1 줄고, 정점에서 돌아 나올 때는 CC의 크기가 1 늘어난다.
  4. DFS가 시작하기 전에는 A=n,C=0|A| = n, |C| = 0이며 DFS가 끝난 후에는 A=0,C=n|A| = 0, |C| = n이다.

3번과 4번의 관찰을 통해 A=C|A| = |C|인 시점이 존재함을 알 수 있다. 이때 A=C=x|A| = |C| = x라고 하자. 만약 xkx \geq k라면, AACC의 크기 kk인 임의의 부분집합을 택하여 X,YX, Y로 둘 수 있다. 이때 1번 관찰에 의해 XXYY는 올바른 답이 된다. 만약 x<kx < k라면, B=nACn2(k1)=n2k+2|B| = n-|A|-|C| \geq n-2(k-1) = n-2k+2이다. 2번 관찰에 의해 BBPn2k+2P_{n-2k+2}-subgraph를 가짐을 알 수 있다.

구현은 매우 짧은 편이다. 구현 시 주의할 점은 GG가 connected라는 조건이 없기 때문에 각 component에 대해서 DFS를 돌리면서 AA, BB, CC는 global하게 관리해야 한다는 점이다.