最初の質問は、出力短絡すべてのパス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