의 하부에서 하위 DAG는 물론 DP, DP 위상 종류의 반지의 존재, 할 수있는 그래프, 나는 spfa DP 사용하는 이유를 알 수 없습니다
spfa 이해 주 조사 사실 공정 spfa은 (d [Y]은> D [X] + w) D [Y]가 D가 = 특히 $ 경우 DP 처리하고, 깊은 [X] 대단히 DP 등 w $ + 공식,
우리는 다른 지점을 업데이트하려고 가능한 모든 업데이트 점 다른 점을, 그 과정에서 가능한 업데이트에 대한 포인트의 다른 점을 계속 검색,
이 질문에 대해, 그 때마다 특정 지점을 업데이트 할 수 있습니다,이 점은 모두 다음 업데이트를 대기열에 그의 아버지, 그리고 그의 아버지를 갱신 할 가능성이 높습니다
하지만 난 여전히 매우, 매우 얕은 이해 spfa 해요
#INCLUDE <. 비트 / stdc ++ H> #DEFINE가 긴 긴 것이다 사용 스페이스 성병; CONST의 INT의 maxn = 200,009 ; CONST INT의 MAXM = 1,000,009 ; 인라인 읽을 것이다 () { LL의 RET = 0 , FIX = 1 ; 숯불 채널; 동안 (! isdigit에 (CH = getchar가 ())) 수정 = 채널 == ' - ' - 1 : 수정; 이렇게 RET = (RET << 1 ) + (RET << 3 ) + CH- ' 0 ' ; 반면 (isdigit에 (CH2 =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] = CNT; } 인라인 공극 ADD2 ( INT U, INT V) { E2 [ ++ CNT2] .V = V, E2 [CNT2] .nxt = head2 [U] head2 [U] = CNT2; } LL D [maxn] 님의 [maxn], [maxn K 개의; 큐 < INT> Q; 부울 V [maxn]; 보이드 spfa () { 위해 ( int로 난 = 1 q.push (Ⅰ), (V) [I] = 내가 ++; i가 N = <) 1 ; 반면 (! q.empty ()) { INT (X) = q.front (); q.pop () (V) [X] = 0 ; LL 합 = S [X]; 위한 ( int로 합계 + =; I I = E [I] I = .nxt 헤드 [X]) D [예를 [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 {) (주 N = ) (판독; 위한 ( int로 난 = 1 , V, R을, 난 ++] i가 N = < ) { S가 [I] ) (판독 = [I] (판독 = K) R은 = 판독 (); 대 ( INT의 J = 1 ; J <= R, J ++ ) V = () 판독 (I, V) ADD2 (V, I)을 추가; } 에 대해 ( int로 I = 1 ; i가 N = <; 내가 ++)을 D [I] = K [I]; spfa (); 의 printf ( "%의 LLD " , D [ 1 ]); }