암소 라우팅 (최단 spfa)

제목 : HTTPS : //www.luogu.org/problem/P3115

문제의 의미 기점 주어진, 경로 둘 행 다음 단 B, 바 N 경로는 첫 번째 행이 두개의 숫자이고, 제 중 하나는이 경로를 가지고, 상기 제 경로 점으로되는 N, 즉, 제 2 단째는 정수 N이 경로를 나타내고있다;

분석 : 1, 주제는 당신이 경로를 이동하려면 비용 홉 경로로 비용, 그래서 심지어는 단지 교통 측이 잘못된 것이라고 말했다;

   이 주제의 1000 범위는, 그래서 우리는 폭력적인면을 내장,하지만 우리는이 길을 걷고 된 경우, 각 경로에 대한 생각이 있어야 구축, 지출이 일정 (즉, 비용의 경로) 그러므로 우리는 내가 직접 보낼 수 있도록 각 지점에 대한 경로 뒤에 점에 J 나는 비용 때문에 전처리 점과 최소의 비용 후, 그래프의 가장자리를 추가하는 것이 고려;

   (3) 마지막 spfa 보면 마찬가지로, 우선 순위 2와 같은 점의 개수 후, 제 우선시;

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스   성병; 
인라인 INT의 판독 () {
     INT의 합 = 0 , X = 1 ;
     CH = getchar가 ();
    동안 (CH2 < ' 0 ' || CH> ' 9 ' ) {
         경우 (CH2 == ' - ' ) 
            X = 0 ; 
        CH = getchar가 (); 
    } 
    동안 (CH2> = ' 0 ' && CH <=에서 ' 9 ') 
        합계 = SUM (<< 1 ) + (합 << 3 ) + (CH ^ 48 ) = CH getchar가 ();
    반환 ? X 합계 - 합계; 
} 
인라인 공극 쓰기 ( INT의 X) {
     경우 (X < 0 ) 
        putchar ( " - " ), X = - (X);
    만약 (x> 9 ) 
        기록 (X / 10 ); 
    putchar (X의 % 10 + ' 0 ' ); 
} 
타입 정의  LL;
CONST  INT INF = 0x3f3f3f3f ;
CONST LL INF = 1E18;
CONST의  INT의 M = 1e3 + (3) ;
INT 맥스 = 0 , TOT, 헤드 [M] 힘 [M], A [M]; 
LL DIS [M] [ 2 ], 선정 된 [M] [M]로 [M] [M];
구조체 노드 {
     INT의 V, nextt; 
    LL 비용, w; 
} E [M의 *의 M];
보이드 addedge ( int로 U, INT의 V, w -1,11,11- 비용) { 
    E [TOT] .V = V; 
    E [TOT] .W = w; 
    E [TOT] .cost = 비용;
    E [TOT] .nextt = 헤드 [U]; 
    헤드 [U]는 ++ = TOT를 ; 
} 
공극 spfa ( INT의 S, INT의 t) {
     위해 ( int로 I = 0 ; i가 = < 1,000 ; 내가 ++ ) 
        DIS [I] [ 0 ] = INF;  < INT > 케; 
    que.push (S); 
    DIS [S] [ 0 ] = 0 ;
    반면 (! {que.empty ())
         INT U = que.front (); 
        que.pop (); 
        힘 [U] =0 ;
         ( int로 , ~ I, I = 헤드 [U] I = E [I] .nextt) {
             INT의 V = E [I] .V;
            경우 (DIS [V] [ 0 ]> DIS [U] [ 0 ] + E [I]를 .W) { 
                DIS [V] [ 0 ] = DIS [U] [ 0 ] + E [I] .W; 
                DIS는 [V] [ 1 ] DIS [U] [= 1 ] + E를 [I] .cost;
                만약 (! {힘이 [V]) 
                    힘이 [V] = 1 ; 
                    que.push (V); 
                } 
            } 
            다른 경우 (DIS [V] [ 0 ] == DIS [U] [ 0 ] + E [I] .W) {
                 경우 (DIS [V] [ 1 ]> DIS [U] [ 1 ] + E [I]. 선정) 
                    DIS는 [V] [ 1 ] DIS [U] [= 1 ] + E를 [I] .cost; 
            } 
        } 
    } 
    경우 (DIS [t] [ 0 ] == INF) 
        의 printf ( " -1 -1 \ n을 " );
    사람 
        의 printf ( " %의 LLD %의 LLD \ 없음 " , DIS [t] [ 0 ], DIS [t] [ 1 ]); 
} 
INT주 () {
     INT A = 판독 (), B)가 (판독 = t가 = ) (판독; 
    memset 함수 (머리 - 1 , 를 sizeof (헤드));
    위한 ( int로 I = 0 ; I는 <= 1000 ; I ++ )
          ( INT J = 0 ; J <= 1000 ; J ++ ) 
            선정 [I] [J] = INF; 
    맥스 = 0 ;
    반면 (t-- ) {
         INT , w =) (N = 판독 판독 ();
         ( INT I = 1; 나는 <= N; ++ i가 ) 
            A [i]를 판독 = (), 맥스 = 최대 (맥스하는 [I]);
        위한 ( int로 난 = 1 ; i가 N = <; I ++ )
              ( INT J = 나 + 1 , J <= N; J ++ )
                 경우 (선정 [A [I]가 [A [J]]> w) { 
                    가격 [ A [I] [A [J]] = w; 
                    경로 [A [I] [A [J]] = J- I; 
                } 
    } 
    에 대해 ( int로 I = 1 ; I <= 맥스; I ++ )
          ( INT J = 1; J <= 맥스, J ++ )
             경우 비용 ([I] [J] < INF) { 
                addedge (I, J, 선정 [I] [J]로 [I] [J]); 
            } 
    spfa (A, B); 
    반환  0 ; 
}
코드보기

 

추천

출처www.cnblogs.com/starve/p/11462488.html