문제 링크
- http://icpc.me/14737
사용 알고리즘
- SCC
- 2-SAT
시간복잡도
- $(HW)^2$
풀이
A에서 B로 간 다음 다시 B에서 A로 돌아오지 못하는 경우가 존재합니다. 그러므로 격자를 그래프로 만들 때 단방향 그래프를 만들어야 합니다.
A에서 B로 간 다음 다시 돌아오지 못할 수 있기 때문에, 어떤 SCC에 도착했다면 그 SCC에 있는 모든 별을 다 먹고 다른 SCC로 이동해야 합니다.
어떤 별 $x$를 먹을 수 있는 조건을 생각해봅시다. (별이 존재하는 SCC $x$에 갈 수 있는 조건이라고 생각해도 무방합니다.)
공은 가로방향 또는 세로방향으로 굴러갈 수 있기 때문에, $x$에 도달하기 위해서는 $x$의 가로 방향에 있는 SCC 혹은 세로 방향에 있는 SCC에 도달할 수 있어야 합니다. 또한 바로 위에 있는 SCC와 바로 아래에 있는 SCC는 같은 SCC이며, 바로 왼쪽에 있는 SCC와 바로 오른쪽에 있는 SCC도 같은 SCC입니다.
각 별을 먹기 위해서 방문해야 하는 SCC의 후보가 최대 2가지이기 때문에 2-SAT을 생각해볼 수 있습니다.
$i$번 SCC에 방문할 것이라면 변수 $A_i$를 참, 방문하지 않을 것이라면 $A_i$를 거짓으로 설정합시다.
- 시작점이 포함된 컴포넌트 $s$에 대해서, $A_s$는 항상 참입니다.
- $s$에서 도달하지 못하는 컴포넌트 $i$에 대해서, $A_i$는 항상 거짓입니다.
- 서로 다른 두 컴포넌트 $i, j$에 대해 $i$와 $j$를 함께 방문할 수 없는 경우, $(¬A_i ∨ ¬A_j)$입니다.
- 각 별 $x$에 대해, $x$를 먹기 위해서 컴포넌트 $i$ 또는 $j$를 방문해야하는 경우, $(A_i ∨ A_j)$입니다.
2-SAT을 돌려서 모순이 생기는지 확인하면 됩니다.
전체 코드
1 |
|