http://acm.hdu.edu.cn/showproblem.php?pid=6705
これは、ゲーム8前の質問の第二の数が少ない問題を抱えていたので、彼らが出てくるが、気持ちは口で言うされていません。。(恐怖が困難に署名していません
質問の意味:マップに、選択肢のカップルに、あなたが最初のk短絡を見つけて、すべてのパスは使用回数に制限はありません。
アイデア:最短は確かに短い作品、第2のショートで、二つの可能性があるが、それは二枚の短い長さであってもよいし、その後、2つだけではないでしょう(最短取るためにそこに継続することができるが、この最初のもしK + 1条:)拡大、第三のショートに本当に可能2である(例えば、1,2,9,1 + 2 <9)、ほとんど明らかにk個のk個のセグメントを短絡することにより(矛盾を構成します、段落のK + 1は、もう少しスローされますことを、それは)確かに最善ではないので、直接サイクルMAX(k)の時間、私はi番目のサイクルのセグメントは、ライン上のアップデートへの道を占めました。あなたはプライオリティキューを開始することができ、およびパスエンドの長さの合計は、構造体を装着しました。
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 typedefの長い長いLL。 CONST int型N = 5E4 + 10。 構造体ノード{ LENにLL。 ノード(){} ノード(-1,11,11-のB)から(A)、LEN(B){} }。 構造体CMP { ブール演算子()(CONSTノード&X、CONSTノード&Y)のconst { y.len x.len>返します。 } }。 BOOL器CMP1(ノードA、ノードB){ a.len <b.len返します。 } PRIORITY_QUEUE <ノード、ベクトル<ノード>、CMP> Q0。 PRIORITY_QUEUE <整数> Q1。 ベクター<ノード> VEの[N]。 LL [N]、B [N]。 init(int型のn){無効 しばらく(!q1.empty())q1.pop(); (!q0.empty())q0.pop()しばらく; [I] .clear()VEのために(; iは<= n iは++ i = 1 INT)。 } INTメイン(){ IOS :: sync_with_stdio(0)。 cin.tie(0)。 cout.tie(0)。 LLのトン。 cinを>>トン。 { - (T)一方 、LL N、M、K CIN >> N >> M >> K。 INIT(N) {(; I <= M I ++はLL I = 1)のための LL U、V、W。 CIN >> U >> V >>ワット。 q0.push({V、W})。 q1.push(W)。 [U] .push_back(ノード(V、W))まし。 } ため(LL i = 1; iが<= N; iは++){ ソート(CMP1を、[I] .begin()VEの[I] .END()VE)。 } LL MX = 0。 用(LL i = 0; iはK <; iは++){ CIN >> [i]は、 MX = MAX(MX、[I])。 } 用(LL I = 1; I <= MX; iは++){ B [I] = q0.top()LEN。 LL X = q0.top()へ。 q0.pop(); (INT J = 0; J <)[X] .size(まし; J ++)用{ LL Y = [X] [J] .TO VEの、lenは= bの[I] + VEの[X] [J] .LEN ; IF(q1.size()== MX){ 場合(LEN> q1.top())ブレーク。 他{ q1.pop()。 q1.push(LEN)。 q0.push({Y、LEN})。 } } 他{ q1.push(LEN)。 q0.push({Y、LEN})。 } } } (LL i = 0; I <K; iは++)用COUT << B [I]] << ENDL。 } 0を返します。 }