도미노 덮기

시간 제한5초메모리 제한128 MB

요약
일부 칸 사이에 선이 그려진 N행 M열 격자를 도미노로 빈틈없이 덮는 배치 중 사전순으로 가장 작은 것을 구하거나 불가능하면 -1을 출력합니다.
난이도

어려움10점 중 9점

유형
그래프, BFS, 그리디, 행렬
정답자
아직 제출이 없습니다

문제

NN개의 행과 MM개의 열로 이루어진 판이 있고, 각 칸에는 번호가 매겨져 있다. 왼쪽에서 ii번째 열, 위에서 jj번째 행에 있는 칸의 번호는 (j−1)×M+i(j-1)\times M + i이다. 따라서 칸의 번호는 11부터 N×MN\times M까지이다.

판의 일부 칸 경계에는 선이 그어져 있다. 각 선은 변을 맞대고 인접한 두 칸 사이의 경계에 놓인다.

이 판 전체를 1×21\times 2 또는 2×12\times 1 크기의 도미노로 겹치거나 빈칸이 남지 않도록 덮으려고 한다. 하나의 도미노는 변을 맞대고 인접한 두 칸을 덮는다. 단, 두 칸 사이에 선이 그어져 있으면 그 두 칸을 한 도미노로 함께 덮을 수 없고, 선이 없으면 함께 덮을 수 있다. 모든 칸은 정확히 하나의 도미노에만 속해야 한다.

입력

첫째 줄에 두 정수 NN과 MM이 공백으로 구분되어 주어진다 (1≤N,M≤1001 \le N, M \le 100). NN과 MM 중 적어도 하나는 짝수이다. 둘째 줄에 선의 개수 LL이 주어진다 (0≤L≤5 0000 \le L \le 5\,000). 이어지는 LL개의 줄에는 각 선이 나누는, 서로 인접한 두 칸의 번호가 공백으로 구분되어 주어진다. 모든 칸의 번호는 위 규칙에 따라 11부터 N×MN\times M까지의 정수이다.

출력

판을 규칙에 맞게 도미노로 덮을 수 없으면 첫째 줄에 −1-1을 출력한다. 덮을 수 있으면 다음 규칙으로 유일하게 결정되는 덮기 방법을 출력한다.

어떤 덮기 방법에서 칸 cc와 같은 도미노로 묶이는 칸의 번호를 pcp_c라 하자. 수열 (p1,p2,…,pNM)(p_1, p_2, \dots, p_{NM})이 사전순으로 가장 작은 덮기 방법을 선택한다. 즉, 칸 11의 짝을 나머지 판도 규칙에 맞게 모두 덮을 수 있다는 조건 아래 될 수 있는 한 작은 번호로 정하고, 이어서 칸 22, 칸 33, …\dots 순서로 같은 방식으로 정한다.

이렇게 정해진 덮기 방법에서 NM/2NM/2개의 도미노를 출력한다. 각 도미노는 한 줄에, 그 도미노가 덮는 두 칸의 번호를 작은 번호가 앞에 오도록 공백으로 구분하여 출력한다. 줄은 앞에 오는(작은) 번호가 증가하는 순서로 출력한다.

예제4

  1. 예제 1

    입력
    4 5
    9
    8 7
    13 14
    14 19
    6 7
    12 7
    4 9
    12 13
    14 9
    9 10
    
    예상 출력
    1 6
    2 7
    3 4
    5 10
    8 9
    11 12
    13 18
    14 15
    16 17
    19 20
    
  2. 예제 2

    입력
    1 2
    0
    
    예상 출력
    1 2
    
  3. 예제 3

    입력
    2 2
    0
    
    예상 출력
    1 2
    3 4
    
  4. 예제 4

    입력
    1 2
    1
    1 2
    
    예상 출력
    -1