以下の下部にサブDAGは明らかDP、DPトポロジカルソートがリングの存在下で、行うことができるグラフで、Iはspfa DP使用する理由を知ることができません
spfa理解の主な調査は、(D [Y]> D [X] + W)D [Y]は非常DPようにD [X] + W $を=特に$場合、実際には、プロセスspfaは、DPプロセスである、深いです式、
私たちは、他の点を更新しようとするすべての可能な更新ポイント他のポイントを取り、プロセスでは、可能な更新のためのポイントの他のポイントを検索していき、
この質問のために、それは毎回特定のポイントを更新することができ、この点は、彼の父親を更新する可能性があり、そしてすべての彼の父キューに次の更新のためのすべて
しかし、私はまだ非常に、非常に浅い理解spfaよ
#include <ビット/ STDC ++ H> の#defineは長い長いllの 使用 名前空間STDを、 const int型 MAXN = 200009 ; const int型 MAXM = 1000009 ; インライン読み取り11(){ LLのRET = 0、=解決1。char型のCH; しばらく(!isdigit(CH = getchar関数()))修正= CH == ' - ' - ?1 :修正します。 行う RET =(RET << 1)+(RET << 3)+ CH- ' 0 ' 。 一方、(isdigit(CH =GETCHAR()))。 リターン修正*のRET; } INT N; 構造体ノード{ int型V、NXT。 } E [MAXM]、E2 [MAXM]。 int型のヘッド[MAXN]、CNT、HEAD2 [MAXN]、CNT2。 インラインボイド追加(INT U、INT V){ E [ ++ CNT] .V = V; E [CNT] .nxt =頭部[U]は、ヘッド[U] = CNT。 } インラインボイド ADD2(INT U、INT V){ E2 [ ++ CNT2] .V = V; E2 [CNT2] .nxt = HEAD2 [U]; HEAD2 [U] = CNT2。 } LL D [MAXN]、S [MAXN]、[MAXN] kは、 キュー < int型> Q; BOOL V [MAXN]。 ボイドspfa(){ ため(int型 i = 1 ; iが<= N; iが++)q.push(I)、V [I] = 1 。 一方、(!q.empty()){ int型のx = q.front(); q.pop(); V [X] = 0 ; LL和 = S [X]。 用(int型 ; I; I =ヘッド[X] I = E [I] .nxt)合計+ = D [E [i]は.V]。 もし(D [X]> 合計){ D [X] = 合計。 用(INT I = HEAD2 [X]; I; I = E2 [i]が.nxt){ もし(!V [E2 [I] .V])q.push(E2 [I] .V)、V [E2 [I] .V] = 1 。 } } } } INT {main()の N = (読み取り) 用(int型 i = 1 ; iが<= N I ++は、V、R {) S [I] =(読み取り); Kは、[I](読み取る。=); R = 読み取り()。 用(INT J = 1 ; J <= R; J ++ ) V = (読み取り)、(I、V)、ADD2(V、I)を加えます。 } のために(int型 i = 1 ; iがn = <; iは++)Dは[I] = K [i]は、 spfa(); printf("%のLLD 」、D [ 1 ]); }