図1から加重無向取得数に対してn接合ノードのパス数、+ 1となるように、第1の経路kのできるだけ小さい大きい右側。
解釈:答えをバイナリ検索、求めている>最高のミッドkのエッジの数、または少し少なめ
書式#include <cstdioを> する#include <cstdlib> 書式#include <ベクトル> の#include <キュー> の#include <CStringの> 使用して 名前空間はstd; INTのN、M、K。 const int型 N = 1003 ; 構造体のノード { int型V、W; ノード(int型 VV、int型WW) {V = W = VV、WW。} ノード(){} }。 ベクター <ノード> G [N]。 INT SZ [N]。 構造体ND { int型のV、D、CNT。 ブール 演算子 <(CONST ND&O)のconst { 戻り D> OD。} ND(int型 VV、int型 DD、int型C) {V = VV、D = DD、CNT =のC; } ND(){} }。 PRIORITY_QUEUE <たNd> Q; INT DIS [N]、[ 1003 ]、MX; //は、需要側未満の以上ミッドKではない BOOLのチェック(INT MID) { しばらく(!q.empty())q.pop(); memset(DIS、 - 1、はsizeof (DIS))。 DIS [ 1 ] [ 0 ] = 0、q.push(ND(1、0、0 )); INT ANS = K + 1 。 しばらく(!q.empty()) { ND T = q.top(); q.pop()。 もし(!tdの= DIS [テレビ] [t.cnt])続けます。 もし(テレビ== N) { ANS = t.cnt。 破ります; } 以下のために(int型 i = 0 ; I <SZ [テレビ]; iは++ ) { INT NX = G [TV] [I] .V、DD、STP = t.cnt。 もし(G [TV] [I] .W> MID)DD = DIS [TV] [STP]、STP ++ 。 他 DD = MAX(G [TV] [I] .W、DIS [テレビ] [STP])。 もし(STP> k)を続けます。 もし(DD <DIS [NX] [STP] || DIS [NX] [STP] == - 1 ) { [NX] [STP]と言う =のDD; q.push(ND(NX、DD、STP))。 } } } 戻り ANS <= K。 } int型のmain() { scanf関数(" %D%D%D "、&N、&M、およびK); int型U、V、W; しばらく(M-- ) { scanf関数(" %D%D%D "、およびuは、&V、およびW) G [U] .push_back(ノード(V、W))。 G [V] .push_back(ノード(U、W))。 } 以下のために(int型 i = 1 ; iが<= N; iは++します) SZ [I] = G [i]が.size()。 INTは L = 0、R = 1 << 30 、ANS。 もし(!チェック(R)) printf(" -1 \ nを" ); 他 { 一方、(L < R) { INT半ば=(L + R)>> 1 。 もし(チェック(MID))、R = ミッド; 他リットル=ミッド+ 1 ; } printf(" %d個の\ n " 、L)。 } リターン 0 ; }