ICPC 아시아 쉬 저우의 예선 대회 2019 J. 임의 접근 반복자 (확률 트리 DP + DP)

주제 링크 : https://nanti.jisuanke.com/t/41392

효과에 제목 : 루트에서 시작, 아버지의 노드에서 시작하는 트리의 깊이를 발견하고 그래서 확률은 각 자녀에 도달 정확한 깊이의 확률이 얻을 물어.

문제 해결 아이디어를 : DP 쓰기는 [유] 유를 루트로하는 서브 트리로 표시됩니다 질문은 유에서 알고리즘의 실행, 정확한 답을 얻을 수있는 확률을 표면하기 시작했다. U가 깊은 DP 잎 [유 = 1, 다른 DP [U] = 0을 남긴다. 전송하면, 확률이 될 수있다 생각하지 못한다.

DP는 [U]는 = 1- (1- (Σdp [V]) / CNT [U]) ^ CNT [U]. [CNT] 노드 번호 U U 자 노드.

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병; 
타입 정의  LL;
CONST LL 모드 1E9 + = 7 ;
CONST의  INT maxn 1E6 + = 5 ;
구조체 일 {
     INT , 다음에; 
STM} [maxn * 2 ];
INT의 어린 아이;
INT의 헤드 [maxn];
보이드 추가 ( INT U, INT V) { 
    STM [TOT] .TO = V; 
    STM [TOT] 다음 내용 = 헤드 [U]; 
    헤드 [U]는 ++ = TOT를 ;
}
LL의 qpow (LL의 N, LL의 m) { 
    LL ANS = 1 ;
    반면 (m) {
         경우 (M 1 ) ANS ANS = N * % 개조; 
        m / = 2 ; 
        N = N * N 개의 %의 모드; 
    } 
    반환 ANS; 
} 
INT의 증착 [maxn];
INT의 maxdep;
INT DP [maxn];
INT CNT [maxn];
보이드 dfs1 ( int로 U, INT의 FA) { 
    DEP [U] = DEP [FA] + 1 ; 
    maxdep = 최대 (maxdep, DEP [U]);
    ...에 대한( int로 I = 헤드 [U] ~ I, I = STM [i]는 다음 내용) {
         INT = 행 STM [I] .TO;
        경우 (FA를 ==하기 위해) 계속 ; 
        CNT [U] ++ ; 
        dfs1 (U, 행); 
    } 
    반환 ; 
} 
공극 DFS2 ( int로 U, INT의 FA) { 
    LL의 TEM = 0 ;
     ( int로 I = 헤드 [U] ~ I, I = STM [i]는 다음 내용) {
         INT = 행 STM [I] .TO;
        경우 (FA를 ==하기 위해) 계속 ; 
        DFS2 (U, 행);
        TEM + =DP [을]; 
    } 
    경우 (DP [U] == 0 ) { 
        TEM = * TEM qpow (CNT [U] mod- 2 ) %의 모드; 
    TEM = ( 1 -tem + 모드) %의 모드; 
    DP [U] = ( 1 -qpow (TEM, CNT [U]) + 모드) % 개조; 
    } 
    
} 
INT 의 main () {
     INT의 N;
    int로 U를 V; 
    memset 함수 (머리 - 1 , 를 sizeof (헤드)); 
    TOT = 0 ; 
    scanf와 ( " %의 D ' , N);
    대한 (값 int = 1을 1 ; i가 N <; 내가 ++ ) { 
        는 scanf ( " % d 개 %의 D를 " , U를, V); 
        (U를 V)을 추가; 
        추가 (V U, 께); 
    } 
    dfs1 ( 1 , 0 );
    위한 ( int로 I = 1 ; i가 N = <; 내가 ++ ) {
         경우 (DEP [I] == maxdep) { 
            DP [I] = 1 ; 
        } 
        다른 { 
            DP [I] = 0 ; 
        } 
    } 
    DFS2 ( 1 , 0);
    // COUT << maxdep << ENDL;
//     대해 (나는 ++; i가 N = <I = 1 INT) 
    (에서 printf " % LLD \ 없음 " , DP [ 1 ]);
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/Zhi-71/p/11489002.html