リンク: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 = 0、INT _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 ; }