도로 지도

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

요약
도로 구간으로 그래프를 만들고 표지판 구간이 만드는 통행 제한을 반영해 두 지점 사이의 유일한 최단 경로를 구하는 문제입니다.
난이도

어려움10점 중 8점

유형
최단 경로, 그래프, 기하, 구현
정답자
아직 제출이 없습니다

문제

어떤 도시의 도로 지도가 주어졌을 때, 주어진 두 점 사이의 최단 경로를 찾는 프로그램을 작성하시오.

도로 지도는 평면 위 선분들의 집합으로 표현된다. 어떤 선분은 도로를 나타내고, 나머지 선분은 어느 방향으로 갈 수 없는지를 나타내는 표지판이다. 어떤 선분의 두 끝점 중 정확히 한 끝점만 다른 선분 위에 놓여 있고 나머지 한 끝점은 그렇지 않다면, 그 선분은 표지판이다. 그 외의 모든 선분은 도로이다.

도로 위의 점 BB에 붙은 표지판은 BB를 지나는 이동을 제한한다. 도로가 BB의 양쪽으로 점 AA와 CC를 지난다고 하고, FF를 표지판의 (도로에 닿지 않은) 자유로운 끝점이라고 하자. 표지판과 도로가 이루는 각들 중에서, 둔각이 있는 쪽에서 예각이 있는 쪽으로는 이동할 수 없다. 예를 들어 각 ABFABF가 예각이고 각 CBFCBF가 둔각이면, AA에서 BB를 지나 CC로는 갈 수 있지만 CC에서 BB를 지나 AA로는 갈 수 없다. 표지판이 도로와 직각을 이루면, BB를 아예 지날 수 없다.

이 규칙을 지키면서 시작점에서 끝점으로 가는 최단 경로를 찾으시오. 두 점 (x1,y1)(x_1, y_1)과 (x2,y2)(x_2, y_2) 사이의 거리는 (x2−x1)2+(y2−y1)2\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}이다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. 각 테스트 케이스는 다음과 같은 형식이다.

각 테스트 케이스의 첫째 줄에는 선분의 개수 nn (1≤n≤2001 \le n \le 200)이 주어진다. 둘째 줄에는 xsx_s와 ysy_s가, 셋째 줄에는 xgx_g와 ygy_g가 주어진다. (xs,ys)(x_s, y_s)는 시작점, (xg,yg)(x_g, y_g)는 끝점이며, 두 점 사이의 최단 경로를 구하면 된다. (xs,ys)(x_s, y_s)와 (xg,yg)(x_g, y_g)는 서로 다르고, 최단 경로는 항상 유일하다.

이어지는 nn개의 줄에는 각 선분의 정보가 x1k y1k x2k y2kx_{1k}\ y_{1k}\ x_{2k}\ y_{2k} 형식으로 주어지며, 이는 kk번째 선분의 두 끝점이다. 한 선분의 두 끝점은 서로 다르고, 두 선분이 교차하는 경우는 없다. 즉, 선분은 항상 끝점에서만 만난다. 모든 좌표는 1000보다 작거나 같은 음이 아닌 정수이다.

출력

각 테스트 케이스에 대해, 시작점에서 끝점으로 가는 최단 경로 위의 점들을 지나는 순서대로 출력한다. 먼저 시작점, 그다음 경로 위에서 도로가 둘 이상 만나는 모든 점, 마지막으로 끝점을 출력한다. 각 점은 한 줄에 하나씩 x좌표와 y좌표를 공백 하나로 구분해 출력하고, 그 테스트 케이스의 마지막 줄에는 0을 출력한다. 교차점은 적어도 두 도로(표지판이 아닌 선분)가 만나는 점을 말하므로, 표지판이 도로에 닿기만 하는 점은 출력하지 않는다. 시작점에서 끝점으로 가는 경로가 없으면 그 테스트 케이스의 출력으로 -1만 출력한다.

예제1

  1. 예제 1

    입력
    3
    8
    1 1
    4 4
    1 1 4 1
    1 1 1 4
    3 1 3 4
    4 3 5 3
    2 4 3 5
    4 1 4 4
    3 3 2 2
    1 4 4 4
    9
    1 5
    5 1
    5 4 5 1
    1 5 1 1
    1 5 5 1
    2 3 2 4
    5 4 1 5
    3 2 2 1
    4 2 4 1
    1 1 5 1
    5 3 4 3
    11
    5 5
    1 0
    3 1 5 1
    4 3 4 2
    3 1 5 5
    2 3 2 2
    1 0 1 2
    1 2 3 4
    3 4 5 5
    1 0 5 2
    4 0 4 1
    5 5 5 1
    2 3 2 4
    
    예상 출력
    1 1
    3 1
    3 4
    4 4
    0
    -1
    5 5
    5 2
    3 1
    1 0
    0