luogu1261 서버 정보를 저장 문제 [최단]

첫째, $ O (N ^ 2 \ 로그 n이) $ 아니라 짧은 다시 실행 출발의 각 지점을 직접 생각 폭력, 약 $ 창피 $ 통계에왔다.
어떻게 최적화를 고려하십시오.
찾을 $ 순위 $ 작고, $ 랭크 $에서 시작하는 것이 좋습니다.
또 다른 점은, 많은 기여를 생산할 수있는 경우 다른 통계 방법을 넣어, 관심 지점 등 각 지점 $의 X의 $ 봐.
그런 다음 다른 점 $ i가 $ dis_i $에 자신의 최단 거리에 $, $ i가 $ F_을 짧은 내부에서 모든 $ rank_x + 1 개 $ 점이다 $ {나는, rank_x + 1 } $는, 그것은 단지 $ 확실하다 dis_i <F_ {I, rank_x + 1} $의 이 일단 생성 기여. 그래서 우리는 짧은 모든 지점에 대한 그의 공헌을 계산 단일 소스 실행 큰 $ 순위 $ 열거 시작점으로 시작할 수 있습니다.
이 세트 포인트 $의 F_ {X, R} $ $으로의 X $으로 (이 단순하기 때문에 또는 $ \ GE는 r $) 인 $ $ $ R & LT 순위 $으로 가까운가 멀다 점과 모두 나타낸다. 통계 총 답변.
그러나 복잡성은 아 변경되지 않습니다. . . `````
사실, 이러한 복잡성은 정말 최적화 할 수 있지만, 제목의 표현을 관찰, 선의의 제목이 우리에게 $ \ 르 30N의 $에 총 기여를 알려줍니다 찾을 수있는 방법입니다. 즉, 실시간으로 가장 효과적인 단기에 $를 실행 dis_i <F_ {내가, rank_x + 1} $의 포인트는 다음 이상이다 통계에 기여에만 기여하지 않는 가능한 포인트만큼을 제외해야합니다.
우리는 $ S $ DIJ 런타임에있는 $ X $ $ Y $에 지점 편안하지만, GE의 F_ \이 시간 $의 dis_y 경우 {Y, rank_s + 1} $는 $ Y $가 불가능합니다 그의 관심은, $ Y $는 다음 편안한 스택의 Z $의 $로 이동하더라도, $ F_ {Z, rank_s} $의 기여를 생성하고 업데이트하는 것은 불가능합니다 . 왜냐하면 :
$$
dis_z \ GE dis_y + W_ {Y, Z} \ {GE F_. Y, rank_s + 1} + {W_ Y, Z} \ {GE F_. Z, rank_z의 + 1}
$$
이완은 $ y를 $으로 기여 술어를 생성 충족하지 않는이 지속적으로 불평등 한 관계를 통해, 힙를 입력하지 마십시오. 따라서, 기부 포인트없이 우리가 힙에 기여한 유일한 점은 입력되지 않습니다. 이론적 같은 복잡성,하지만 대답을 보장 할 수있는 제목에 따라 때문에이 문제가 채택 될 수 있지만.
어쨌든,이 최적화를 기대하지 않았다. . 너무 불멸. .
코드가 내부 $ 시간으로 $ 30,000까지 memset 함수 것을 알 수 있습니다, 이것은하지 않을 것이다 T. . memset 함수 바이트 수동 할당보다 빠르게 채울 아마 없기 때문에, 실제 시험은 수십만 위에 작은 상수 memset 함수의 수, n은 파티를 발견했다.

1 #INCLUDE <iostream>
 2 #INCLUDE <cstdio>
 3 #INCLUDE <CString을>
 4 #INCLUDE <알고리즘>
 5 #INCLUDE <cmath>
 6 #INCLUDE <큐>
 7  #DEFINE의 DBG (X) cerr << #x를 << "="<< X << ENDL
 8  사용  스페이스 성병;
9 타입 정의  LL;
10 타입 정의 를 두 번 DB;
11 의 typedef 쌍 < INT , INT > PII;
(12) 서식 <유형 이름 T> T _min 인라인 (TA, TB) { 반환 은 <B를? A : B}
(13) 서식 <유형 이름 T> T _max 인라인 (TA, TB)를 { 반환 > B를를? A : B}
 14 서식 <유형 이름 T> 인라인 CHAR MIN (T & A, TB) { 복귀 A> B (A = B? 1 ) : 0 }
 15 서식 <유형 이름 T> 인라인 CHAR MAX (T & A, TB) { 반환 은 <B를 (A = B? 1 ) : 0 }
 16 서식 <유형 이름 T> 인라인 공극 _swap (T & A, T 및 B) {A ^ = B ^ = A ^ = B}
 17 서식 <유형 이름 T> 인라인 판독 T (T & X) {
 18      , X = 0 ; INT의 F = 0;  C; 반면 (isdigit에 (c = getchar가 ())!) 경우 (c == ' - ' ) F = 1 ;
19 일      동안 (isdigit에 (c)) X = X * 10 + (c & 15 ), C = getchar가 (); 반환 F를 X = - X : X;
20  }
 21  CONST의  INT의 N = 30000 + 2 , M = 150000 + 2 ;
22  구조체 thxorz { INT w로, NXT;} G [M << 1 ];
23  INT의 헤드 [N], TOT;
24 벡터 <INT > RK [ 11 ];
25  INT의 N, m, ANS;
26 인라인 공극 Addedge ( INT의 X, INT의 Y, INT의 z) {
 27      G [++ TOT] .TO = Y, G [TOT] .nxt = 헤드 [X], 헤드 [X] TOT, G [TOT를] = .W = Z;
28      G [++ TOT] = .TO의 X, G [TOT] = .nxt 헤드 [Y], 두부 [Y] = TOT, G [TOT] .W = Z;
29  }
 30  #DEFINE 의 Y G의 [j를] .TO
 31  INT의 F [N] [ 11 ], DIS [N];
32 priority_queue <PII 벡터 <PII> 큰 <PII>> Q;
33 인라인 공극 DIJ ( INTS, INT의 R) {
 34      memset 함수 (DIS, 0x3F입니다 , 는 sizeof DIS) q.push (make_pair (DIS [S] = 0 , S));
35      동안 (! q.empty ()) {
 36          INT X = q.top () 둘째, D =. q.top () 제]. q.pop ();
37          경우 (DIS [X] ^ D)가 계속 ;
38          ++ ANS, MIN (F [X] [R], d);
39           (등록 INT ; J J = J = 헤드 [X] G [J] .nxt)
 (40)              의 경우 (MIN (DIS [Y] D + G [J] .W) && DIS [Y] <F [Y [R + 1 ]) q.push (make_pair (DIS [Y, Y));
41      }
42  }
 43  #undef를 Y
 (44)  INT 의 main () { // freopen을 ( "test.in", "R", 표준 입력); // freopen을 ( "test.ans", "w", 표준 출력); 
45      리드 (N), (m)를 읽고;
46       (등록 하는 int I = 1 ; i가 N <=], X ++ I) (X), RK 읽기 [X] .push_back (I);
47       (등록 하는 int I = 1 , X, Y, Z; I <= m; ++ I), (z) 판독 (X), (Y) 판독을 판독 Addedge (X, Y, Z);
48      memset 함수 (F, 0x3F입니다 , 를 sizeof F);
49       (등록 INT I = 10, I - I) {
 50           (등록 INT J = 0 ; J <RK [I] 크기는 (); ++ j)를 DIJ (RK [I] [J], I);
51           (등록 INT J = 0 ; J <RK [I] 크기는 (); ++ j)는 F [RK [I] [J] [I] = 0 ;
52           (등록 INT J = 1 ; J를 <= N; ++ j)는 F [J] [Ⅰ- 1 ] = F [J] [I];
53      }
 54      리턴 의 printf ( " % D \ 없음 " , ANS), 0 ;
55 }
코드보기

반사 : 대답은 보증의 주제와 관련된 경우, 최적화가 가능한 한 배제 할 수없는 유일한 대답하는보기의 통계 지점. 이 질문에 초과 정책을 제거하기 위해 예를 들어, 당신은 처음으로 불가능 전략, 미래가 도입 될 수있다 이러한 성격 나올 수 없습니다 찾을 수 있어야하며,이에 따라 달라집니다 추측 뿐만 아니라, 때문에, 그래서 시간이되도록 통계 대답하는 것입니다 경우 기여가 없다 즉시 중복 가지를 잘라 . 가장 짧은 방법은 너무 많이 가리 키도록, 불가능을 제거하려고합니다.

추천

출처www.cnblogs.com/saigyouji-yuyuko/p/11604710.html