오래된 공장의 급수 배관

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

요약
물 높이를 정해 물이 차는 구역을 고르고, 열린 구멍은 뚜껑이나 새 파이프로 막아 최소 비용으로 시작점에서 도착점까지 물을 보낸다.
난이도

어려움10점 중 9점

유형
그래프, 최소 신장 트리, 그리디, 기하
정답자
아직 제출이 없습니다

문제

당신은 오래된 공장에서 두 지점 사이로 물을 보내는 시스템을, 건물에 남아 있는 낡은 배관을 재활용하여 만들기로 했다. 낡은 배관은 파이프와 접합점(junction)으로 이루어져 있다. 접합점은 예전에 파이프들이 연결되어 있던 지점이다. 일부 낡은 파이프는 손상되어 제거되었고, 그 결과 그 파이프가 연결되어 있던 접합점에는 열린 구멍이 남았다. 물이 열린 구멍에 닿으면 그 구멍으로 물이 쏟아져 건물이 침수되므로, 이런 일은 반드시 피해야 한다.

이 문제는 열린 구멍 사이에 새 파이프를 설치하거나, 열린 구멍을 마개로 막아서 해결할 수 있다. 새 파이프는 서로 다른 두 접합점에 있는 두 개의 열린 구멍을 잇는다. 파이프를 설치하면 그 두 구멍은 막히고, 물은 그 파이프를 통해 흐를 수 있다. 새 파이프의 비용은 두 접합점 중심 사이의 유클리드 거리와 같다. 마개 하나의 비용은 0.50.5이다. 물이 절대 닿지 않는 접합점의 열린 구멍은 신경 쓰지 않아도 된다.

두 접합점은 특별하다. 하나는 물을 밀어 넣는 출발점(접합점 11)이고, 다른 하나는 물이 필요한 도착점(접합점 NN)이다. 마개와 새 파이프를 모두 설치한 뒤, 물은 출발점에서 당신이 정한 높이까지 올라갈 수 있는 압력으로 주입된다. 압력은 일정하며 자유롭게 정할 수 있지만, 적어도 출발점과 도착점의 높이까지 물을 밀어 올릴 수 있을 만큼은 되어야 한다. 목표는 건물을 침수시키지 않으면서 출발점에서 도착점까지 물을 보내는 가장 저렴한 방법을 찾는 것이다.

물은 다음 규칙을 따른다. 압력이 어떤 접합점을 채울 만큼 충분하면 그 접합점은 물로 찬 상태를 유지한다. 물이 찬 접합점에서, 물은 수평이거나 아래로 향하는 파이프로는 언제나 흐르고, 위로 향하는 파이프로는 압력이 정한 높이까지만 흐른다. 즉, 당신이 정한 수위를 HH라 하면, 물은 높이가 HH 이하인 접합점들 중에서, 높이가 HH 이하인 접합점만을 지나는 파이프 경로로 출발점과 연결된 접합점들을 정확히 채운다. 물이 찬 접합점의 열린 구멍에 물이 닿으면 건물이 침수된다.

기존 파이프와 새 파이프는 서로, 그리고 자신이 연결하는 접합점 이외의 다른 접합점과 절대 간섭하지 않는다(두 접합점을 잇는 선분이 세 번째 접합점을 지나더라도 닿지 않는다).

입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며 파일의 끝에서 종료된다.

각 테스트 케이스의 첫째 줄에는 두 정수 NN과 MM이 주어진다. NN (2≤N≤4002 \le N \le 400)은 접합점의 수이고(접합점은 11번부터 NN번까지 번호가 매겨진다), MM (0≤M≤500000 \le M \le 50000)은 사용 가능한 기존 파이프의 수이다.

이어지는 NN개의 줄에는 각각 네 정수 xix_i, yiy_i, ziz_i, kik_i가 주어지며, −10000≤xi,yi,zi≤10000-10000 \le x_i, y_i, z_i \le 10000, 0≤ki≤4000 \le k_i \le 400을 만족한다. ii번째 줄은 접합점 ii를 나타낸다. (xi,yi,zi)(x_i, y_i, z_i)는 그 위치이고 zz축이 수직 방향이며, kik_i는 그 접합점에 있는 열린 구멍의 수이다.

이어지는 MM개의 줄에는 각각 두 정수 aja_j와 bjb_j가 주어지며 1≤aj<bj≤N1 \le a_j < b_j \le N을 만족한다. 이는 파이프 jj가 접합점 aja_j와 bjb_j를 잇는다는 뜻이다. 어떤 두 접합점을 잇는 파이프는 많아야 하나이고, 좌표가 같은 두 접합점은 없다. 출발점은 접합점 11, 도착점은 접합점 NN이다.

출력

각 테스트 케이스마다 한 줄에 Case x: v 형식으로 출력한다. x는 11부터 시작하는 테스트 케이스 번호이다. 건물을 침수시키지 않고 출발점과 도착점을 연결할 수 있으면 v는 최소 총비용을 소수점 아래 넷째 자리까지 정확히 출력한 값이고, 불가능하면 v는 impossible이라는 단어이다.

예제3

  1. 예제 1

    입력
    7 6
    2 0 1 1
    0 0 0 2
    1 0 4 3
    3 0 4 3
    5 0 1 1
    3 0 2 0
    5 0 3 0
    1 2
    1 3
    3 4
    4 7
    5 7
    6 7
    4 1
    2 0 0 0
    3 0 1 0
    4 1 0 1
    5 1 1 1
    1 2
    
    예상 출력
    Case 1: 4.0000
    Case 2: impossible
    
  2. 예제 2

    입력
    2 1
    0 0 0 2
    1 0 0 1
    1 2
    
    예상 출력
    Case 1: 1.5000
    
  3. 예제 3

    입력
    2 0
    0 0 0 1
    4 0 0 1
    
    예상 출력
    Case 1: 4.0000