タイトル説明
出力プログラムがある場合は-1 N-牛、2つの制限の間、一方は、他方が距離Xより小さくない、距離x以下であり、nは1との距離の最大数を求める無限遠よいです出力-2。
2 ≤ N ≤ 。1 0 0 0、2つの制限。1 ≤ MのL 、 M D ≤ 1 0 。4
問題の解決策
微分制約裸のタイトル。
これは、最大距離が必要なため、最短?条件が最大値から低下するまでの最短経路であると思われるので、最終的にそれが最大でなければならないので。
この質問は、注意すべき場所は、負のリングが伝達され、1、負のリング未満のspfa可能文からこれだけ1つの実行されないことです。
唯一のリングを没収してもすべての側面を指すように仮想点を構築するには、仮想リングからspfaポイント没収を走りました。
DIS [n]が更新されていない場合は最後に、最短ランspfa要求から、それはありません2つの制約を意味します。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineっ長い長い のconst int型 OO = 2000000000 ; const int型 MAXN = 1005 ; const int型 MAXM = 21005 ; int型nは、M1、M2; int型のヘッド[MAXN]、CNT; 構造体のエッジ{ int型のY、次。 ヴァルLL; } E [MAXM]。 テンプレート < クラス T>インラインボイドリード(T&X){ X = 0。CHAR CH =getchar関数(); しばらく(!isdigit(CH))CH = getchar関数(); 一方、(isdigit(CH)){X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR();} } ボイド追加(int型のx、int型のY、LLのZ) { E [ ++ CNT] = (エッジ){Y、ヘッド[x]は、Z}。 ヘッド[X] = CNT。 } キュー < INT > Q。 LL DIS [MAXN]、CX [MAXN]。 BOOL VIS [MAXN]。 無効 spfa(int型の){ しばらく(!q.pop()q.empty()); にとって(int型私= 0 ; iがn = <; iは++)DIS [I] = OO、CX [I] = 0、VIS [I] = 偽。 DIS [S] = 0 ; VIS [sは] = 真 ; CX [S] = 1 。 q.push(S); 一方、(!q.empty()){ int型のx = q.front()。 q.pop(); VIS [X] = 偽。 以下のために(int型 I =ヘッド[X]; I; I = E [i]は.next){ int型、Y = E [I] .Y。 もし(DIS [Y]> DIS [X] + E [I] .val){ DIS [Y]= DIS [X] + E [I] .val。 場合(!VIS [Y]){ q.push(Y); VIS [y]は = 真。 もし(++ CX [Y]> N){のprintf(" -1 ");出口(0 );} } } } } } int型のmain(){ (n)を読み出す;(M1)を読み出す;(M2)を読み出します; 以下のために(int型 I = 1 ; I <= M 1; iは++ ){ int型のX、Y。 LLのZ。 // DIS [Y] -dis [X] <= Z // DIS [Y] <= DIS [X] + Z 読み取り(X)、(Y)を読み出す;(z)を読み取ります。 (x、y、z)を加えます。 } のために(int型 I = 1 ; I <= M2; iは++ ){ int型X、Y。 LLのZ。 // DIS [Y] -dis [X]> = Z // DIS [X] <= DIS [Y] -z (x)を読み出す;(y)を読み取るは、(Z)を読み出します。 追加(Y、X、 - Z)。 } のために(int型 I = 1が加算(iは++; iがn = <)0、I、0 ); spfa(0 )。 spfa(1 )。 printf(" %のLLD "これは、[A] == OOですか?- 2 :それは[A])です。 }