HDUパス最短6705

  最初の質問は、出力短絡すべてのパスkに意図されています

 

プライオリティキュー検索時間の複雑さの一つのチームメイトには全く問題なく、MLEではありません

 

維持するように設定することができます

#include <ビット/ STDC ++ H>
 の#define <整数、整数> PI対
 の#define MK make_pair
 の#defineが長い長いllの
 使用 名前空間STDを、
const  int型 MAXN = 5E4 + 10 構造体ノード{
     int型Uと、
    DIS LL; 
    ブール 演算子 <(constのノード&T)CONSTは{
         返す DIS> t.dis。
    } 
}。
ベクター <PI> G [MAXN]。
PRIORITY_QUEUE <ノード> Q。
マルチセット <LL> S;
LL ANS [MAXN * 10 ]。
int型  QRY [MAXN]。
無効のinit(int型N){ 
    s.clear()。
    以下のためにint型 i = 1 ; iが++; iが<= N 
        G [i]が.clear(); 
    しばらく(!q.empty())
        q.pop(); 
} 
int型のmain()
{ 
    int型のT。
    scanf関数(" %のD "、&T)。
    一方、(T-- ){
         int型 N、M、Q、U、V、W、K、MX = 0 
        scanf関数("%D%D%D "&N、&M&Q)。
        以下のためにint型 I = 1 ; I <= M; iは++ ){ 
            scanf関数(" %D%D%D "、&​​U&V、およびW)
            G [U] .push_back(MK()V、W)。
            q.push(ノード{V、W})。
            s.insert(W)。
        } 
        のためのint型 i = 1 ; iが<= N; iが++ 
            ソート(G [i]が.begin()、G [i]が.END())。
        以下のためにint型 iは= 1 iは++; I <= Q 
            のscanf(" %dの"、&​​QRY [i])と、MX = MAX(MX、QRY [I])。
        int型 CNT = 0 ;
        一方(CNT < MX){ 
            ノードTMP = q.top()。
            q.pop(); 
            ANS [ ++ CNT = tmp.dis。
            もし(CNT> = MX)
                 ブレーク
            U = tmp.u。
            (オートこれ:G [U]){ 
                V = it.second。
                W LL = it.first + tmp.dis。
                もし(s.size()== MX){ 
                    自動猫 = - s.end();
                    もし(W> = * 猫)
                         ブレーク
                    s.erase(猫)。
                    s.insert(W)。
                } 
                
                    s.insert(W)。
                q.push(ノード{V、W})。
            } 
        } 
        のためにint型 iは= 1 ; I <= Q iは++ 
            のprintf(" %LLDする\ n " 、ANS [QRY [I])を、
        INIT(N)
    } 
}
コードの表示

 

参考ギャングます。https://blog.csdn.net/ccsu_cat/article/details/100047649

おすすめ

転載: www.cnblogs.com/bxd123/p/11408663.html
おすすめ