제목 설명
지금은 공기에 의해 여행 앨리스와 밥, 그들은 상대적으로 싼 항공사를 선택했다. 총 항공사 n은 n 개의 도시 교통으로는,이 도시는 라벨 세트 0 0 ~ n은 1. N - . 1, 총 m의 경로 m의 종류, 각 두 도시를 연결하는 경로 및 가격 특정 경로 .
앨리스와 밥은 이제 경로를 따라 다른 도시로 한 도시에서 당신이 터닝 포인트가 될 수있는 방법을 도착. 또한 그들이 제공하는이 여행에 착수 항공, 그들은 최대 무료 케이 경로의 K 종류에 비행. 앨리스와 밥 다음이 여행을 지출 할 수있는 최소 금액은?
입력 및 출력 형식
입력 형식 :
첫 번째 라인은 세 개의 정수 데이터 보유 N- 형, m, 케이 N- 형 , M , K 각각 도시 개수 노선 무료 타기의 수.
두 번째 줄은 두 개의 정수가 S, T는 S , t을, 자신의 여행 도시 ID 번호의 시작점과 도시의 끝을 나타냅니다.
그런 다음 세 가지 정수의 m의 행이 A, B, C , B , C는이 도시에서 경로 나타냅니다 A가 도착시 B의 B는, 또는 도시에서 B의 B 도착시 A, 가격 에 ㄴ 다.
출력 형식 :
하나 개의 라인은 최소 비용, 정수를 포함.
샘플 입출력
층은 K + 1로 분할 될 수있다
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; // BXD 의해 입력 #DEFINE의 담당자 (나는 A는 b)에 대한 (; 나는 = (b) <I ++는 i가 (a) = INT) #DEFINE에 대한 REPP을 (I, a가, b) (I = (a int로 ) I> = (b) - I) #DEFINE RI (N)는 scanf ( "%의 D", 및 (N)) #DEFINE RII (N, M)는 scanf ( "%의 D % d에", N, 및 m) #DEFINE의 RIII (N, M, K)는 scanf ( "% D % D % D", 및 N, M, K) #DEFINE의 RS (들)는 scanf ( "%의 S ', S); #DEFINE가 긴 긴 것이다 #DEFINE REP (I, N)를 위해 (ⅰ = 0을 나타내는 int i가 (N를 <); 나는 ++) #DEFINE의 CLR (A, V)가 memset을 (A, V, N = 1E6; CONST의 INT M = 1E8; INT의 헤드 [M]; INT의 POS; 구조체 노드 { INT의 V, NEX하는 단계; 에지} [M]; 보이드 추가 ( int로 A, INT의 B, INT의 C)를 { 에지 [ ++ POS] = .nex 헤드 [A]; 헤드 [A] = POS; 에지 [POS] .V = C; 에지 [POS] .TO = B; } 구조체 노드 { INT의 D, ID; 부울 연산자 <( CONST노드 b) CONST { 복귀 D> BD; } }; int로 DIS [N], 힘 [N]을; INT의 N, M, K, A, B, C, S, T; 보이드 익스트라 ( INT의 S) { CLR (DIS, 0x3F입니다 ); DIS [S] = 0 ; priority_queue <노드> Q; q.push (노드 { 0 , S}); 반면 (! q.empty ()) { 기지국 U = q.top (); q.pop (); 경우 (힘 [u.id]) 계속 ; 힘 [u.id] =1 ; 위한 ( int로 I =; I = I 헤드 [u.id] 에지 [I]를 .nex) { INT의 V = 에지 [I] .TO; 만약 (모서리 u.d + [I] .V < DIS [V]) { DIS [V] = + u.d 에지 [I] .V; q.push (DIS 노드 {[V], V}); } } } } INT 의 main () { RIII (N, M, K); RII (S, T)의 ++; t ++ ; 렙 (I, 1 , m) { RIII (A, B, C) ++; B ++ ; (를 A, B, C)를 추가, 부가 (B, A, C); 렙 (j, 1 , k)는 { (j를 추가 *의 N + A, j 개의 * N + B를, c); (j를 추가 *의 N + B, j 개의 * N + , A, C)를 추가 ((j - 1 ) * N + A, j 개의 * N 개의 + B를을, 0 ); 추가 ((j를 - 1 ) * N + B, j 개의 * N + A, 0 ); } } 익스트라 (S); INT ANS = DIS [t]; 렙 (I, 1 , K) ANS = 분 (ANS, DIS [t + 난 * N]); COUT << ANS; 반환 0 ; }