[설명] luogu_P4042_ 나이트 게임 (DP + spfa

의 하부에서 하위 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 ]); 
}

 

추천

출처www.cnblogs.com/superminivan/p/11494267.html