[ブラシ] [タイトル]最短電話回線を設定

図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(100 ));
    
    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 ;
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/xwww666666/p/11669601.html
おすすめ