被験者の第一波 https://www.luogu.org/problem/P1119
問い合わせに対応する私たちは、時間によってソート求めることができ、この質問は、正常動作してポイントを再構築されています
出発点の実行として彼に、それぞれの更新ポイントを再びdijstra
他の二つの点の間の短絡に影響を与える可能性が最も高い新しいポイントを追加するのでもちろん、これは十分ではありません
我々はdijstraを終了した後もそう短絡最新この点を彼らができるかどうかを確認するために、n個の四角に2点を列挙する必要があります
すべての更新の複雑さがn ^ 2 + mlogn最悪の全体的な複雑さがn個あるので^ 3lognある複雑さのポイントを行います
話題の200 nは明白な複雑さまでは合理的に実用的な評価がアップし、高速で実行されています
書式#include <cstdioを> する#include <CStringの> の#include <アルゴリズム> 書式#include <キュー> の#include <cmath> 使用して 名前空間はstd; CONST INT M = 507、INF = 1E9 + 7 。 INTはREAD(){ int型 ANS = 0、F = 1、C = GETCHAR()。 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')、F = - 1。C = GETCHAR();} 一方、(C> = ' 0 ' && C <= ' 9 '){ANS = ANS * 10 +(C- ' 0 ')。C = GETCHAR();} 戻り ANSの*のF。 } int型N、M、Q、WH [M]。 構造体 {ノードINT E [M *は、次の、W、へ} M]。 INT 最初の[M]、CNT。 ボイドイン(int型のx、int型の Y、INT W){E [++ CNT] =(ノード)最初{Y、[x]は、W}。最初の[X] = CNT;} int型、DIS [M] [M]をに [M]、ANS [M * M]。 構造体 QAQ {INT X、Y、ID、T;} S [Mの*のM]。 int型 CMP(QAQのX、QAQのY){ 戻り xTの< YT;} 構造体qwq { int型のID、dは、 ブール 演算子 <(CONST qwq&X)CONSTは { 返す XD < D;} }。 PRIORITY_QUEUE <qwq> Q; ボイド DJ(int型S){ で [S] = 1。DIS [S] [S] = 0 ; q.push((qwq){S、DIS [S] [S]})。 一方、(!q.empty()){ qwq X = q.top()。q.pop(); もし(DIS [S] [x.id <XD)続けます。 以下のために(int型 I =; I I =最初の[x.id] {E [I] .next) INT今= Eを[I] .TO。 もし(!で [今])続けます。 もし(DIS [S] [今]> DIS [S] [x.id] + E [I] .W){ DIS [S] [今] = DIS [S] [x.id] + E [I] .W。 q.push((qwq){ここで、DIS [S] [今]})。 } } } のための(int型 i = 1 ; iが<= N iが++)場合(で、[I])DIS [i]は[S] =DIS [S] [I]。 以下のために(int型 i = 1 ; iが<= N; iが++)場合(で、[I]) のための(INT J = 1 J ++; J <= n)の場合(で[J]) であれば(DIS [I] [J ]> DIS [i]は[S] + DIS [S] [J])DIS [I] [J] = DIS [I] [S] + DIS [S] [J]。 } int型のmain(){ int型、X、Y、W、今= 1 。 N =読み取ります(); M = 読み取ります(); 以下のために(int型 i = 1 ; iが<= N; I ++ ) のための(INT J = 1; J <= nであり、j ++)の場合(I = J)DIS [i]は[J] =!infファイル。 以下のために(int型 I = 1 WH [i])と(読み取り=; iは= N <Iが++)で [I] = 0 ; 以下のために(int型 iは= 1、X =リード()+; I <= M iは++)1、y)は(+読み取る。= 1、W = イン(X、Y、W)、イン(Y、X)(リード)W。 Q = 読み取り(); 以下のために(INTは I = 1 ; I <= Q; iは++)S [i]は.X読み取り=()+ 1、S [i]は.Y =(読み取り)+ 1、S [i]を.T =読み取ります() 、S [i]は.ID = I。 ソート(S + 1、S + 1+ Q、CMP); 以下のために(int型 I = 1 ; I <= Q; iは++ ){ 一方(今<= N && WH [今] <= sの[I] .T)(今)、今++ DJ 。 もし((!で [S [i]を.X])||(!で [S [i]は.Y])||(DIS [S [i]は.X] [S [i]は.Y] == INF))ANS [S [i]は.ID] = - 1 。 他 ANS [S [i]は.ID] = DIS [S [i]は.X] [S [i]は.Y]。 } のために(int型 iは= 1(のprintf iは++; I <= Q)" %Dを\ n " 、ANS [I])。 リターン 0 ; }