문제 보기 - 가장 안전한 경로 (TOKI14_safest)

시간 제한메모리 제한제출 횟수제출한 사람 수해결한 사람 수정답률
600 ms128 MiB622100.00%

승현이는 여행하기를 좋아해서, 프로그래머들에게 임의의 한 도시에서 출발하여 또다른 도시에 도착하는 최단 경로를 찾는 것을 도와 달라고 요청하고는 합니다. 몇 년 간의 여행 후, 그는 최단 경로가 언제나 가장 시간이 절약되는 경로는 아니라는 것을 깨닫게 되었습니다. 이러한 현상은 최단 경로 상의 도로들이 매우 상태가 좋지 않아서 다시 돌아가서 또다른 경로를 찾아야 할 때 발생할 수 있습니다. 그래서 이번에는 그는 가장 안전한 경로를 찾는 데에 관심이 있습니다.

VV개의 도시와 EE개의 도로가 있습니다. 도시들에는 11 이상 VV 이하의 번호가 붙어 있습니다. 각 도로는 서로 다른 두 개의 도시를 연결하며 양방향입니다. 예를 들어, 아래 그림을 봅시다.

각 원은 도시를 나타내고 그 안에 있는 숫자는 도시 번호를 나타냅니다. 각 선분은 도로를 나타내며 그 옆의 숫자는 길이를 나타냅니다.

승현이가 1번 도시에서 출발하여 5번 도시에 도착하고자 한다면, 최단 경로는 2번 도시를 방문한 뒤 5번 도시에 도착하는 것이 됩니다. 이 경로는 <1, 2, 5>와 같이 쓸 수 있습니다. 하지만, 승현이는 이상적이지 않은 상황에서의 최단 경로를 알고자 합니다. 예를 들어, 1번 도시와 2번 도시를 잇는 도로가 파괴되었다면, 최단 경로는 <1, 3, 5>가 될 것이고 그 길이는 8입니다. 만약 1번 도시와 2번 도시를 잇는 도로는 멀쩡하지만 2번 도시와 5번 도시를 잇는 도로가 파괴되었다면, 승현이는 2번 도시에서 다시 1번 도시로 돌아간 뒤 3번 도시를 거쳐 5번 도시에 도착해야만 합니다. 이 시나리오에서 승현이가 이동한 거리는 3+3+8=143 + 3 + 8 = 14입니다.

X1X_{1}번 도시에서 XNX_{N}번 도시까지 <X1X_{1}, ...,="" X3X_{3},="" X2X_{2},="" XNX_{N}="">의 경로로 이동하고자 한다면, 승현이는 이 경로에 대해 "비이상적 길이"라는 것을 아래와 같이 정의합니다.


max {
   모든 도로가 멀쩡하다고 가정할 때 distance(X1, X2, X3, ..., XN),
   X1와 X2를 잇는 도로가 파괴되었다고 가정했을 때 X1과 X2 사이의 최단 경로의 길이,
   distance(X1, X2) + X2와 X3를 잇는 도로가 파괴되었다고 가정했을 때 X2과 XN 사이의 최단 경로의 길이,
   distance(X1, X2, X3) + X3와 X4를 잇는 도로가 파괴되었다고 가정했을 때 X3과 XN 사이의 최단 경로의 길이,
   ...,
   distance(X1, X2, X3, ..., XN-2) + XN-2와 XN-1를 잇는 도로가 파괴되었다고 가정했을 때 XN-2과 XN 사이의 최단 경로의 길이,
   distance(X1, X2, X3, ..., XN-1) + XN-1와 XN를 잇는 도로가 파괴되었다고 가정했을 때 XN-1과 XN 사이의 최단 경로의 길이
}

이 때 distance(X1X_{1}, X2X_{2}, ..., XpX_{p})는 (X1X_{1}X2X_{2}를 잇는 도로의 길이 + X2X_{2}X3X_{3}를 잇는 도로의 길이 + ... + Xp1X_{p-1}XpX_{p}를 잇는 도로의 길이)를 나타냅니다.

위의 정의에 따르면 경로 <1, 2, 5>의 비이상적 길이는 max(6,8,14)=14\max(6, 8, 14) = 14입니다. 이것보다 더 나은 경로가 있는데, 바로 <1, 3, 5>입니다. 파괴된 도로가 없다면 최단 경로는 8입니다. 1번 도시와 3번 도시를 잇는 도로가 파괴되었다면, 경로의 길이는 6입니다. (<1, 2, 5>) 만약 3번 도시와 5번 도시를 잇는 도로가 파괴되었다면 (1번 도시에서부터 3번 도시에 도착한 후에), 승현이는 4번 도시를 거쳐 5번 도시를 방문하면 되며 이 때 경로의 길이는 9입니다. 따라서 <1, 3, 5>의 비이상적 길이는 max(8,6,9)=9\max(8, 6, 9) = 9가 됩니다.

마침내, 승현이는 "가장 안전한 경로"를 비이상적 길이가 가장 짧은 경로로, "가장 안전한 경로의 길이"를 가장 안전한 경로의 길이로 정의합니다. 따라서, 위의 예제에서 가장 안전한 경로는 <1, 3, 5>이며 그 길이는 9가 됩니다.

도시들과 도로들의 정보가 주어질 때, SS번 도시에서 출발하여 TT번 도시에 도착하는 가장 안전한 경로의 길이를 찾는 프로그램을 작성하세요.

입력 형식

첫 번째 줄에 네 개의 정수 VV, EE, SS, TT가 주어집니다. 다음 EE개 줄에는 3개의 정수 aa, bb, cc가 주어지는데, aa번 도시와 bb번 도시를 잇는 길이가 cc인 양방향 도로가 존재한다는 것입니다.

출력 형식

가장 안전한 경로의 길이를 출력합니다.

예제

예제 1

입력

5 7 1 5
1 2 3
2 5 3
1 3 4
3 5 4
1 4 4
4 5 4
4 3 1

출력

9

예제 2

입력

4 5 1 4
1 2 1
2 3 1
3 4 1
1 3 2
2 4 2

출력

3

예제 설명

첫 번째 예제는 위에서 기술되어 있습니다.

두 번째 예제에서 가장 안전한 경로는 <1, 2, 4>이며 그 길이는 max(3,3,3)=3\max(3, 3, 3) = 3입니다. 참고로 경로 <1, 3, 4>의 비이상적 길이는 5이고, <1, 2, 3, 4>의 비이상적 길이는 5입니다.

서브태스크

각 서브태스크에서,

  • 1S,TV1 \le S, T \le V
  • STS \neq T
  • 1EV×(V1)/21 \le E \le V \times (V-1) / 2
  • 1a,bV1 \le a, b \le V
  • 1c10,0001 \le c \le 10,000
  • 각 도로는 서로 다른 두 도시를 연결합니다.
  • 모든 서로 다른 두 도시의 쌍에 대해 이 도시들 사이에는 최대 1개의 도로가 존재합니다.
  • 어떤 도로가 파괴되었다면, SS에서 출발하여 TT에 도착하는 대안 경로가 적어도 하나 존재한다는 것이 보장됩니다.

서브태스크 1 (14점)

  • 1V61 \le V \le 6

서브태스크 2 (30점)

  • 1V1001 \le V \le 100

서브태스크 3 (25점)

  • 1V2501 \le V \le 250

서브태스크 4 (18점)

  • 1V5001 \le V \le 500

서브태스크 5 (13점)

  • 1V2,5001 \le V \le 2,500
  • 처음에 SS에서 출발하여 TT에 도착하는 단순 경로가 정확히 두 개 존재합니다.</X1X_{1},>