BOJ 1739 도로 정비하기

BOJ 1739 도로 정비하기

문제 링크:

문제 내용

NN개의 가로 도로와 MM개의 세로 도로가 NMNM개 지점에서 서로 교차하는 형태의 도로망이 있습니다. ii번 가로 도로와 jj번 세로 도로가 교차하는 지점을 (i,j)(i, j)라고 합시다.

KK대의 차가 각각 출발지 (ai,bi)(a_i, b_i)에서 도착지 (ci,di)(c_i, d_i)로 이동하려고 하는데, 각 차는 최대 하나의 가로 도로와 최대 하나의 세로 도로만을 이용할 수 있습니다.

KK대의 차가 조건을 충족하면서 출발지에서 도착지로 이동할 수 있도록 각각의 도로를 일방통행으로 만들 수 있는지 판별하세요.

입력

첫 줄에 테스트 케이스의 개수 TT가 주어집니다. (1T101 \le T \le 10)

각 테스트 케이스에 대해, 첫 줄에 NN, MM, KK가 주어집니다. (1N,M,K10001 \le N, M, K \le 1000)

다음 KK줄에는 각각의 차의 출발지와 도착지를 나타내는 값 aia_i, bib_i, cic_i, did_i가 순서대로 주어집니다. (1ai,ciN1 \le a_i, c_i \le N, 1bi,diM1 \le b_i, d_i \le M)

출발지와 도착지는 같을 수 있습니다.

출력

각 테스트 케이스에 대해, 각각의 도로를 일방통행으로 만들 방법이 있으면 Yes, 아니면 No를 출력합니다.

문제 풀이

스포일러

이 문제는 2-SAT으로 모델링하여 풀 수 있습니다.

먼저 “ii번째 가로 도로가 오른쪽 방향이다"와 “ii번째 세로 도로가 아래 방향이다"를 변수로 만듭니다. 그러면 각각의 차에 대해 다음과 같이 조건식을 세울 수 있습니다.

  • 출발지와 도착지가 같다면 무시합니다.
  • 두 지점의 가로 도로 번호가 같다면, 그 가로 도로의 방향을 고정합니다. 마찬가지로, 두 지점의 세로 도로 번호가 같다면, 그 세로 도로의 방향을 고정합니다.
  • 그렇지 않다면, 가로로 먼저 이동하는 것과 세로로 먼저 이동하는 것의 두 가지 방법이 있습니다. 각 방법은 두 개의 도로의 방향을 고정하며, 이는 두 개의 항(변수 또는 변수의 부정)의 AND로 나타낼 수 있습니다. 적어도 둘 중 한 가지 방법으로 이동이 가능해야 하므로, 이는 (wx)(yz)(w \wedge x) \vee (y \wedge z) 꼴의 식이 되고, 이를 분배법칙으로 전개하면 (wy)(wz)(xy)(xz)(w \vee y) \wedge (w \vee z) \wedge (x \vee y) \wedge (x \vee z)가 되어 2-SAT 모델링에 사용할 수 있게 됩니다.

이제 2-SAT을 푸는 함수에 넣고 결과가 나오는지 확인하면 됩니다.

Last updated on