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가 주어집니다. (1≤T≤101 \le T \le 10)

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

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

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

출력

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

문제 풀이

스포일러

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

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

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

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

Last updated on