CF 1076 Dエッジ削除(SPT + BFS)

リンク:https://codeforces.com/problemset/problem/1076/D

 

質問が意図されて:あなたはn個の頂点を与えるために、m個のエッジは重み付きグラフを無向。穿刺の頂部側の観点から1dの頂点からの最短距離、点は、この点が呼び出され、まだ最短距離dである場合には、残数がK以下であるようないくつかの側縁、原画像を削除する必要があります良いです。最も良い点を作り、境界線が消去方法を尋ねました。

解釈:ダイクストラ最短経路レコードは、検索は、通信ブロックサイズkへの最短経路ツリーをBFS。

<ビット/ STDC ++ H>の#include
 の#define IO_read IOS :: sync_with_stdio(偽); cin.tie(0)
 の#define FRE freopenは( "in.txt"、 "R"、STDIN)
 の#define(I、_for 、B)(iは= int型のために、私は、Bを<; Iは++)
 の#define _repを(iは、B)(iは=にint; iが= Bを<; I ++)は
 使用して 名前空間STDを、
typedefの長い 長いLL。

const  int型 MAXN = 3E5 + 5 CONST  長い 長い inf_ll =(LL)1 << 61 構造体qnode {
     INT V。
    LLのC; 
    qnode(int型 _v = 0、LL _c = 0 ):V(_V)、C(_c){}
     ブール 演算子 <(CONST qnode&R)のconst {
         戻り C> RC。
    } 
}。

構造体のエッジ{
     int型V、
    LLコスト; 
    int型のID。
    エッジ(INT _V = 0、LL _cost = 0INT _id = 0 ):V(_V)、コスト(_cost)、ID(_id){} 
}。

ベクター <エッジ> E [MAXN * 2 ]。
BOOL VIS [MAXN]。
LL DIS [MAXN]。
INT [MAXN]事前;

ボイドダイクストラ(INT nは、INTの開始)
{ 
    memsetの(VIS、0はsizeof (VIS))。
    以下のためにint型 i = 1 ; iが<= N; iは++)DIS [I] = inf_ll。
    PRIORITY_QUEUE <qnode> QUE。
    que.push(qnode(開始、0 )); 
    DIS [スタート] = 0 ;
    一方、(!que.empty())
    { 
        qnode TMP = que.top()。que.pop();
        int型のu = tmp.v。
        もし(VIS [U])継続; 
        VIS [U] = ;
        以下のためにint型 i = 0 ; iは、Eを<U] .size(); iは++ 
        { 
            int型、V = E [U] [I] .V。
            LLコスト = E [U] [I] .cost。
            もし(VIS [V] && DIS [V]> DIS [U] +!コスト)
            { 
                DIS [V] DIS [U] + = コスト。
                事前[V] = U。
                que.push(qnode(V、DIS [V]))。
            } 
        } 
    } 
} 

ベクトル < INT > ANS。

ボイド BFS(int型 K、int型の開始)
{ 
    場合(k個の== 0のリターン; 
    キュー < 整数 > QUE。
    que.push(スタート)。
    しばらく(!que.empty())
    { 
        int型のu = que.front(); que.pop();
        以下のためにint型 i = 0 ; iは、Eを<U] .size(); iは++ 
        { 
            int型、V = E [U] [I] .V。
            場合(PRE [V] == U){ 
                que.push(V)。
                ans.push_back(E [U] [i]は.ID/ 2 )。
                もし(ans.size()== k)をリターン
            } 
        } 
    } 
} 

int型(メイン)
{ 
    IO_read。
    // FRE; 
    INTのN、M、K。
    CIN >> N >> M >> K。
    _rep(I、1 、M)
    { 
        int型Uを、V。
        長い 長いワット。
        CIN >> U >> V >> ワット。
        E [U] .push_back(エッジ(V iは、wは * 2 ))。
        iは、wがE〔V〕.push_back(エッジ(U、 * 2 + 1)); 
    } 
    ダイクストラ(N、1 )。
    BFS(K、1 )。
    coutの << ans.size()<< " \ nを" ; 
    _for(I、0 、ans.size())
        COUT << ANS [I] << "  " リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Yokel062/p/11719707.html