最短 - 階層グラフ

https://www.luogu.org/problem/P1948

LuoguP1948電話回線

K回の無料の機会 - >(I、K)への各点(I)の分割、kは偶然私の後の自由時間の使用を示します。

図ので、斜視図(三次元)に(二次元)正常ますが、依然として二次元を達成

いつものようにそれぞれの側の上に構築し、次いで接点としてマップを構築し、それが二つの層の間に自由端です。

最後の(N k)の各DIS点(K Nを過ごす機会を使用して)参照。

DIS [V]> DIS [U] +ヴァル[I] DIS [V]タイトル> maxまで(DIS [U]、ヴァル[I])。

#include <ビット/ STDC ++。H>
名前空間の使用はstdを。
CONST int型N = 1E6 + 10、M = 1E7 + 10、INF = 1E9。
INTのN、P、K。
INTヘッド[N]、NEX [M * 2]、[M * 2]、ヴァル[M * 2 ]、TOT。 ボイドビルド(INT U、int型V、INT W){TOT ++; NEX [TOT =頭部[U];の[TOT = V;ヴァル[TOT = W;頭部[U] = TOT;} BOOL VIS [N]。INT DIS [N]。PRIORITY_QUEUE <ペア<int型、int型>> Q; ボイドspfa(){ため(iは1 = int型、iが<= N *(k + 1); iは++)DIS [I] = INF。q.push(make_pair(-0,1 ))。DIS [1] = 0 ; (!一方q.empty()){int型、U = q.pop();第二q.top()。場合(VIは、[U])は引き続き、VIを[U] = 1 以下のために(INT I =ヘッド[U]; I; I = NEX [I]){int型V =乃至[I] = W MAX(DIS [U]、ヴァル[I])。IF(DIS [V]> W){DIS [V] = W。q.push(make_pair( - )V、W)。}}}} int型のmain(){scanf関数( "%D%D%D"、&N、&P&K)。(I = 1 wは、U、V int型; I <= P、iは++の場合){scanf関数( "%D%D%D"、&U&V、およびW)用(int型J = 0であり、j <= kであり、j ++ ){(U + J×n個、V + j個*構築wは、N)を、構築(V + jのの* nを、U + jは*のN、W); }(INT J = 0;){N- *(1 U + J *のN-、V +(J +。)をビルド0 );(V + J *のN-、U +(J + 1)* N-、0ビルド);}} SPFA()と、INT ANS = INFは、のために(;私は= Kを<; I = 0 int型Iが++ ){ANS =分(ANS、DIS [N-を+ Iは* N-]);}(!ANS = INF)のprintf( "%のD" IF 、ANS );他のprintf( " - 1" );}著者:yfxJ518リンクします。https://www.acwing.com/activity/content/code/content/124992/ ソース:著者によって予約AcWingの著作権。商業転載は非商用の転載は、ソースを明記してください、権限の作者に連絡してください。

 

おすすめ

転載: www.cnblogs.com/fengJ518/p/11628114.html