본문 바로가기

학습컨텐츠/알고리즘/데이터구조

Manhattan (2SAT)

Manhattan


당신에게 임무가 주어졌다. 도시의 도로를 디자인 하는 것이다. 당신의 도시에는 수평으로 나있는 도로가 있고 수직으로 나있는 도로가 있어 격자를 이루고 있다. 디자인 한다는 것은 각각의 수평, 수직도로의 방향을 결정하는 것이다. 각 도로는 결정된 단 하나의 방향으로만 이동해야 한다. 또한 시민들은 당신에게 자신들의 요구사항을 말해줄 것이다. '요구'는 자신이 원하는 시작 위치에서 끝 위치까지 단순한 경로가 하나 이상 존재해야 한다는 것이다. 아래의 그림을 보도록 하자. 시민 한사람의 요구사항이 그림과 같을 때 a)는 불가능한 경로이다. 왜냐하면 도로의 방향대로 움직이지 않았기 때문이다. b)는 가능한 경로이긴 하지만 단순한 경로가 아니다. 단순한 경로는 정확히 한 번 굴절된 경로를 말한다. c)만이 시민이 요구하는 단순한 경로이다.


당신이 해야 할 일은 시민들의 요구사항을 모두 만족하도록 도로를 디자인 할 수 있는지 없는지를 결정하는 프로그램을 작성하는 것이다.


입력 형식

첫 번째 줄에는 입력데이터의 개수가 주어진다. 두 번째 줄에는 도로의 개수들 V, H가 입력된다. V는 수직도로의 개수이고 H는 수평도로의 개수이다. V와 H는 30보다 작거나 같다. 같은 줄에 시민들의 요구사항의 개수 N이 주어진다. N은 200보다 작은 수이다. 다음 N개의 줄에는 시민들의 요구사항이 입력되는데 하나의 요구사항은 두 개의 좌표 x1, y1, x2, y2로 이루어져 있다. 두 좌표 중 처음 좌표는 시작위치이고 두 번째 좌표는 도착위치이다. 하나의 좌표 x, y라는 것은 x번째 수직도로와 y번째 수평도로가 만나는 지점을 의미한다. 각 숫자의 범위는 0 < x1, x2 <= V, 0 < y1, y2 <= H 이다.


출력 형식

시민들의 요구사항을 모두 만족하면서 도로를 디자인 할 수 있으면 'Yes'를 그럴수 없으면 'No'를 출력한다.


예제 입출력

Manhattan.in

Manhattan.out

3
6 6 2
1 1 6 6
6 6 1 1
7 7 4
1 1 1 6
6 1 6 6
6 6 1 1
4 3 5 1
9 8 6
2 2 4 4
4 5 3 2
3 4 2 2
3 2 4 4
4 5 2 2
2 1 3 4

Yes
No
No