제목 : 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 ; }