문제
2-SAT으로 환원해서 풀 수 있는 신기하고 재밌고 어려운 문제입니다.
저는 최대 유량과 2-SAT을 떠올렸으나 각 칸을 정점으로 하는 방식에 매몰되어 두 칸의 매칭을 정점으로 하는 방법을 떠올리지 못했습니다.
풀이
JusticeHui님의 블로그를 참고했습니다.
매칭
각각의 검은 칸은 위쪽 혹은 아래쪽의 하얀 칸을 하나 선택, 오른쪽 혹은 왼쪽의 하얀 칸을 하나 선택해야 하고, 이 선택들은 다른 선택과 겹치면 안 됩니다. 이 선택을 두 칸을 선으로 잇는 것으로 보고 매칭이라 하겠습니다. 임의의 매칭은 항상 검은 칸과 하얀 칸을 이어야 합니다.
검은 칸
검은 칸과 위쪽 하얀 칸을 잇는 매칭을 $U$, 같은 방식으로 왼쪽, 아래쪽, 오른쪽 하얀 칸을 잇는 매칭을 $L$, $D$, $R$이라 합시다.
조각은 L모양이므로 $U$와 $D$중 하나는 꼭 선택되어야 하고, $L$과 $R$중 하나는 꼭 선택되어야 합니다.
\[(U \lor D) \land (L \lor R)\]$U$와 $D$를 모두 선택하면 검은 칸이 겹치므로 둘 중 하나는 선택하면 안 되고, $L$과 $R$의 경우도 마찬가지입니다.
\[(\neg U \lor \neg D) \land (\neg L \lor \neg R)\]하얀 칸
동일한 하얀 칸과 다른 인접한 검은 칸을 잇는 임의의 두 매칭 $A$, $B$는 둘 모두 선택되면 안 됩니다. ($\neg A \lor \neg B$)
또한, L 모양 조각은 하얀 칸 두개와 검은 칸 하나로 이루어져 있으므로 하얀 칸의 개수는 정확히 검은 칸의 개수의 2배여야 합니다.
2-SAT
각 매칭은 하나의 정수로 나타낼 수 있습니다.
$(i, j)$와 $(i, j + 1)$의 매칭을 $mi + j$, $(i, j)$와 $(i + 1, j)$의 매칭을 $mi + j + nm$으로 나타냅시다.
어떤 칸 $c$와 왼쪽 칸의 매칭은 왼쪽 칸과 오른쪽 칸($c$)의 매칭과 같아야 하므로 자연스럽게 $(i, j)$와 $(i, j - 1)$의 매칭은 $mi + j - 1$, $(i, j)$와 $(i - 1, j)$의 매칭은 $(m(i - 1) + j + nm)$이 됩니다.
이와 같은 방식을 적절히 이용해서 2-SAT을 돌리면 해결할 수 있습니다. 그래프에서 총 정점의 개수는 $4nm$이므로 메모리 관리에 주의합시다.
코드
1 | |