羅区P1119再建--dijstra

被験者の第一波  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 = - 1C = 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] = 1DIS [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 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/yourinA/p/11716865.html