나무 심기 - 로스 밸리 P1250 (차동 제한)

프리픽스의 순서로 [I], 요구 ⼀는 S (R)에 상당하다 -들 [1 - 1]> = X의.

는 S를 포함하는 청구항에 다른 문제가있다 [내가] - S [I - 1] <= 1, S [I] - S [I-1]> = 0.

은 S에 연결된 모든 노드를 슈퍼 원점의 빌드 (S = N + 1 - 1)

차동 구속 시스템 간의 상대적인 관계는 요소만을 규정

가능한 문제의 의미에 따라, 일정한 최종 답변 사이의 상대적 관계는 작은

그래서 최종 답변을해야한다 : DIS [N] - min_dis

 

#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <큐> 
#INCLUDE <알고리즘>
 사용  스페이스 성병; 

인라인 INT의 판독 () 
{ 
    INT의 합 = 0 , p = 1 ;
     CH = getchar가 ();
    동안 (CH2 < ' 0 ' || CH> ' 9 ' ) 
    { 
        경우 (CH2 == ' - ' ) 
            (P) = - 1 ; 
        CH =  getchar가 ();
    }
     동안 (CH2> = ' 0 ' && CH <= ' 9 ' ) 
    { 
        (합계 * = 10 ) = CH + - ' 0 ' ; 
        CH = getchar가 (); 
    } 
    리턴 합 * P; 
} 

CONST  INT maxn = 30,005 , MAXM = 5005 ;
INT의 N, M, S, CNT;
INT DIS [maxn, 헤드 [maxn];
불리언 힘 [maxn];
구조체 에지 
{ 
    INT의 NXT에 웨이; 
} E [maxn * 5 ]; 

보이드 추가 ( INT의 X, INT의 Y, INT의 z) 
{ 
    E [ ++ CNT] = .nxt 헤드 [X]; 
    E [CNT] .TO = Y; 
    E [CNT] .wei = Z; 
    헤드 [X] = CNT; 
} 

공극 spfa ( INT X) 
{  < INT > Q 단계; 
    q.push (X); 
    위한 ( int로 I = 0 ; I는 <= N + 1 ; I ++는 ) 
        DIS [I] =1E9; 
    DIS [S] 
                {= 0 ; 
    힘 [들] = ;
    반면 (! q.empty ()) 
    { 
        INT O = q.front (); 
        q.pop (); 
        힘 [0]는 = 거짓 ;
         ( int로 , I, I = 헤드 [0] I = E [I] .nxt) 
        { 
            INT의 V = E [I] .TO;
            경우 (DIS [V]> DIS [0] + E [I] .wei) 
            { 
                DIS [V] = DIS [0] + E [I] .wei;
                만약 (! 힘 [V]) 
                    q.push (V);
                    힘 [V] = ; 
                } 
            } 
        } 
    } 
} 

INT ) (주 
{ 
    N =) (읽기, m = 판독 (); 
    S = N + 1 ; 
    memset 함수 (머리 - 1 , 를 sizeof (헤드));
    위한 ( int로 I = 0 ; I <= N은, 내가 ++ ) 
        추가 (S, I, 0 );
    int로 A, B, C를;
    위한 ( int로 I = 1 ; I <= m; 내가 ++ ) 
    { = 읽기 (), B = 판독 (), C = 판독 (); 
        추가 (B, A - 1 - c); 
    } 
    에 대해 ( int로 I = 1 ; i가 N = <; 내가 ++ ) 
    { 
        추가는 (i - 1 , I, 1 ); 
        추가 (I, I - 1 , 0 ); 
    } 
    spfa (S); 
    INT ANS = 1E9;
    위한 ( int로 I = 0 ; I ++는, 난 <= N ) 
         ANS =분 (ANS, DIS [I]); 
    의 printf ( " %의 D " , DIS [N] - ANS);
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/darlingroot/p/11221586.html