P4568은 [JLOI2011] 그래프 짧은 비행 경로를 계층화

  

제목 설명

지금은 공기에 의해 여행 앨리스와 밥, 그들은 상대적으로 싼 항공사를 선택했다. 총 항공사 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, 가격 에 다.

 

출력 형식 :

 

하나 개의 라인은 최소 비용, 정수를 포함.

 

샘플 입출력

입력 샘플 # 1 :  복사
5 6 1 
0 4 
0 1 5 
1 5 2 
2 3 5 
4 5 
2 3 3 
0 2 100
출력 샘플 # 1 :  복사
8

 

층은 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 ; 
}
코드보기

 

추천

출처www.cnblogs.com/bxd123/p/10959909.html