버스 기사 승재

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

요약
호텔, 출발점, 관광지가 있는 그래프에서 절반 규칙을 지키며 모든 호텔을 태우고 내려주는 최단 경로를 구한다.
난이도

어려움10점 중 8점

유형
그래프, 최단 경로, 동적 계획법, 비트 연산
정답자
아직 제출이 없습니다

문제

승재는 유명한 관광 회사 ALPS에서 버스 기사로 일합니다. 승재가 하는 일은 ALPS 본사에서 버스로 출발해 hh개의 호텔에서 관광객을 한 명씩 태우고, 그들을 모두 관광지로 데려간 뒤, 다시 각자의 호텔로 돌려보내고 ALPS 본사로 돌아오는 것입니다. ALPS가 가는 관광지는 언제나 한 곳으로 정해져 있어, 버스는 늘 그 한 곳만 들르면 됩니다.

ALPS는 서비스를 중시하기 때문에, 먼저 태운 관광객을 대체로 먼저 내려 주려고 합니다. 구체적으로, ALPS는 다음 규칙을 따릅니다. hh개의 호텔에서 어떤 순서로 관광객을 태웠을 때, 태운 순서가 앞에서부터 h/2h/2번째 이내인 관광객은 내리는 순서도 앞에서부터 h/2h/2번째 이내여야 합니다.

예를 들어 관광객을 1 2 3 4 5 순서로 태웠다고 합시다. 이때 2 1 3 4 5나 1 2 5 3 4 순서로 내려 주는 것은 괜찮지만, 1 3 2 4 5 순서로 내려 주는 것은 안 됩니다. 2번째로 태운 관광객이 3번째로 내렸는데, 33은 5/25/2보다 크기 때문입니다.

승재는 기름값을 아끼고 싶어서, 하루 동안 버스가 이동하는 전체 거리를 최소로 하고 싶습니다. ALPS 본사와 호텔들, 그리고 관광지 사이의 이동 시간이 주어질 때, 규칙을 지키면서 버스가 이동하는 전체 거리의 최솟값을 구하세요.

규칙은 태우고 내리는 순서만 정하기 때문에, 규칙을 지키면 최단 경로가 되지 않을 수도 있고, 때로는 호텔을 그냥 지나쳐야 할 수도 있습니다. 오직 규칙을 지키면서 이동 거리가 가장 짧은 경로만 구하면 됩니다.

입력

각 테스트 케이스의 첫째 줄에는 정점의 수 nn (3≤n≤203 \le n \le 20)과 간선의 수 mm (2≤m2 \le m)이 주어집니다. nn은 호텔과 관광지, 그리고 출발 지점을 모두 포함한 수입니다.

정점은 00번부터 n−1n-1번까지 번호가 매겨집니다. 00번 정점은 버스의 출발 지점, n−1n-1번 정점은 관광지이며, 11번부터 n−2n-2번까지의 정점은 호텔을 뜻합니다.

이어서 mm개의 줄에 세 정수 uu, vv, tt (0≤u,v≤n−10 \le u, v \le n-1, 1≤t≤36001 \le t \le 3600)가 주어집니다. 이는 uu에서 vv로 가는 데 시간 tt가 걸린다는 뜻입니다. 길은 양방향이므로 vv에서 uu로 가는 데에도 시간 tt가 걸립니다.

임의의 두 정점 사이에는 경로가 반드시 하나 이상 존재한다고 가정해도 좋습니다. 입력에는 여러 개의 테스트 케이스가 있으며, 입력의 끝까지 처리합니다.

출력

각 테스트 케이스마다 Case t: d를 출력합니다. tt는 테스트 케이스 번호(1부터 시작), dd는 규칙을 만족하는 가장 짧은 이동 거리입니다.

예제1

  1. 예제 1

    입력
    5 4
    0 1 10
    1 2 20
    2 3 30
    3 4 40
    4 6
    0 1 1
    0 2 1
    0 3 1
    1 2 1
    1 3 1
    2 3 1
    
    예상 출력
    Case 1: 300
    Case 2: 6