2019アジア南昌まずラウンドオンラインプログラミングコンテスト消火ヒーロー(ダイクストラ)

 

消防ヒーロー

 

これは、単一のソース最短に、ポイントを考えていない構築されています。

その後、それは問題ダイクストラ水になります。

 

#include <ビット/ STDC ++ H> 
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型のmod = 998244353 ;
const  int型 MAXN = 1E3 + 50 const  int型 INF = 0x3f3f3f3f 

構造体P {
     int型、にV。
    P(){} 
    P(INT TTO、INT VV){= TTOに; V = VV;} 
}。
ベクター <P> P [MAXN]。

ストラクト{アップ
     ブール 演算子()(CONST、P&P1CONST P&P2)のconst { 戻り p1.v> p2.v;} 
}。// 单调递增 
 // に星のコスト(QUE [] V。)(QUE []へ。); 

int型vpoi [MAXN]。
LL DIS [MAXN]、N、MAXVAL。
ボイドをDij(int型の)
{ 
    PRIORITY_QUEUE <アップP、ベクトル<P>、> QUE。
    memset(DIS、INF、はsizeof (DIS))。
    int型I、J。
    INT VIS [MAXN]、プリ[MAXN]、K。
    Pポイ。
    (i = 1 ; iが<= N; iは++)VIS [I] = Sを、予め[I] = 0 ;
    以下のための(I = 0;私は、pを<S] .size(); iは++ 
    { 
        DIS [P [S] [I] .TO] = P [S] [I] .V。
        que.push(P(P [S] [I] .TO、DIS [P [S] [I] .TO]))。
    } 
    DIS [S] = 0 ; VIS [S] = 1 ;予め[S] = 0 ;
    (i = 1 ; iがn <; iは++ 
    { 
        POI = que.top(); que.pop()。
        一方、(!DIS [poi.to] = poi.v || VIS [poi.to])// 失效或已访问
        { 
            POI = que.top(); que.pop()。
        } 
        K = poi.to; VIS [K] = 1 (J = 0 ; J <P [k]は.size(); J ++ 
        { 
            場合(VIS [P [k]は[J] .TO] && DIS [P [k]は[J] .TO]!> DIS [ K] + P [k]は[J] .V)
            { 
                DIS [P [k]は[J] .TO] = DIS [K] + P [k]は[J] .V。
                プレ[P [k]は[J] .TO] = K。
                que.push(P(P [k]は[J] .TO、DIS [P [k]は[J] .TO]))。// 更新
            } 
        } 
    } 
    MAXVAL = 0 (i = 1 ; iが<= N; iは++ 
    { 
        場合(MAXVAL <DIS [i])とMAXVAL = DIS [i]は、
    } 
} 
int型メイン()
{ 
    LLのT。
    scanf関数(" %のD "、&T)。
    一方、(T-- 
    { 
        int型I、J、U、V、W。
        INT V、E、S、K、C、ID [MAXN] [MAXN]、[MAXN] kは、
        memsetの(ID、 - 1はsizeof (ID))。
        ANS2、ANS1 LL; 
        scanf関数(" %D%D%D%D%D "、&​​V、&E、&S、&K&C);;
        (i = 1 ; iは= V + < 1 ; I ++ )Pを[I] .clear();
        (i = 1 ; iは= Kを<; iは++)のscanf(" %dの"& K [i])と、
         のための(i = 1 ; iが= Eを<; Iは++ 
        { 
            scanf関数(" %D%D%D "、&​​U&V、およびW)
             であれば(ID [U] [V ] == - 1 
            { 
                ID [U]は[V] = P [U]は.size(); P [U]は.push_back(P(V、W)); 
                ID [V] [U]は = P [V ] .size(); P [V] .push_back(P(U、W));
                 続ける; 
            } 
            もし(P [U] [ID [U] [V]、V <= W)続ける; 
            P [U ] [ID [U] [V]、V。 = W; P [V] [ID [V] [U] V = W。
        } 
        N = V。
        Dij(S); ANS1 = MAXVAL。
        N = V + 1 (i = 1 ; iは= Kを<; iは++ 
        { 
            P [V + 1 ] .push_back(P(K [i]が、0 )); 
            。P [K [I]一back(P(V + 10 ))。
        } 
        をDij(V + 1); ANS2 = MAXVAL。
//         のprintf( "##%LLD%LLD \ n"は、ANS1、ANS2)。
        もし(ANS1 <= ANS2 * C)のprintf(" %LLDする\ n "、ANS1)。
        のprintf(" %LLDの\ nを" 、ANS2)。
    } 
}

 

おすすめ

転載: www.cnblogs.com/kkkek/p/11488243.html