위기의 ING!
D 3 시간에 참여는 끝이 전에 갑자기 잘못 생각하는 경우, 변경, 먹는 Orz 통과하지 않았다.
불행하게도, 토폴로지는 [N]를 사용하기 !! 잘못된 순서를 추구 -> A [1] 결과와 N-> 1이되었다. 로 MASI QAQ은 팀의 일원
추가의 예는 (1-N 정확하게 위상 시퀀스이다
질문이 DAG 1에서 N까지 각각의 시간 X / (X + 1)가되도록 의도 부착 점의 확률이다, 1 / (X + 1)에 서의 확률은 (포인트 X가 연결되어, 여전히 수). 하루에 각각 이동, 현재 날짜를 이동 때마다, 원하는 포인트 N 소비에 도달하는 데 필요한 에너지를 많은 에너지 값을 소모합니다.
아주 초기 느낌 원하는 DP DAG 시작 실행하고 일의 예상 개수 제공된 에너지를 원하는 움푹 DP [I] N 원하는 지점 일 수 내가 초기 DP [N] = 0, 전이에 시점에서 $의 DP [I] = \ tfrac {1} {X + 1} * \ 합 DP [J] + \ tfrac {1} {X + 1} * DP [내가] + $ J- 1> 난 예리.
이어서 원하는 에너지를 재실행 DP2가 [I] N 내가 원하는 에너지 포인트이고, 초기 DP2 [N] = 0, $ DP2 [내가] = \ tfrac {1} {X + 1} * \ 합 DP2 전송 [J] + \ tfrac {1} {1} + X * DP2 [I] + DP는 [I] $ J-> 칼날.
매우 추한 코드 미안 보인다.
1 #INCLUDE <. 비트 / stdc ++ H> 2 사용 스페이스 성병; 3 CONST의 INT maxn = 4e5 + (10) ; 4 구조체 노드 { 5 개 의 INT (S), 즉, 다음; 6 } 에지 [maxn] edge2 [maxn]; 7 INT의 헤드 [maxn] head2 [maxn, LEN, LEN2; (8) 공극 의 init () { 9 memset 함수 (헤드 - 1 , 를 sizeof (헤드)); 10 memset 함수 (head2 - 1 , 를 sizeof (head2)); 11 LEN = LEN2 = 0 ; 12 } 13 공극 추가 ( INT의 S, INT의 E) { 14 가장자리 [렌] =의 .S 들; 15 가장자리 [LEN] 전화부 = E; 16 가장자리 [LEN] 다음 내용 = 헤드 [S]; 17 헤드 [들] ++ = 렌 ; 18 } 19 무효 ADD2 ( INT의 S, INT의 E) { 20 edge2는 [LEN2] = .S 용의 S; 21 edge2 [LEN2] 전화부 = E; 22 edge2 [LEN2] 다음 내용 = head2 [S]; 23 head2 [S] = LEN2 ++ ; 24 } 25 번 DP [maxn, DP2 [maxn]; 26 INT 에서 [maxn], A [maxn, NUM [maxn]; (27) 보이드가 해결 ( INT의 N) { 28 개 INT의 렌즈 = 0 ; 29 큐 < INT > Q; (30) 에 대한이 ( int로 I = 1 난 ++; i가 N = < ) (31) 의 경우 ( 에 [I] == 0 ) q.push (I); 32 동안 (! q.empty ()) { 33 INT의 p = q.front (); q.pop (); (34) A [렌즈 ++] = P; (35) 에 대한이 ( int로 , I = - I = 헤드 [P]! 1 ] I = 가장자리 [i]는 다음 내용) { 36 INT의 Y = 가장자리 [I] 전화부; 37 에서 [Y] - ; 38 의 경우 ( 에서 [Y] == 0 ) 39 q.push (Y); 40 } 41 } 42 } 43 INT 의 main () { 44 의 INT t; 45 는 scanf ( " %의 D " , t); (46) 동안(t-- ) { 47 INT의 N, M, X, Y; 48 는 scanf ( " %의 D % d에 " , N, m); 49 INIT (); (50) 에 대한이 ( int로 I = 1 ; i가 N = <; 내가 ++ ) (51) 에 [내가] = 0 , NUM [내가] = 0 , DP2는 [I] DP가 = [I] = 0 ; (52) 에 대한이 ( 값 int = 1을 1 ; 나는 <= m; 내가 ++ ) (53) 는 scanf ( " % d 개 %의 D ' , X, Y)에 추가 (X, Y) ADD2 (Y, X) 의[Y]는 ++ ; // 순방향 역방향도 실행 포워드 토폴로지를 각각 저장 원하는 역방향 추구 54이다 // 순차적 토폴로지 찾을 (N-) 해결 55 DP [A가 [N-] = 0 ; 56 인 위한 ( INT X = N-, X> = 1이다. ] x-- ) {// 매일 원하는 DP가 푸시 다운 57 IF DP [A [X] = NUM + [A [X] (! A [X] = N-) + . 1 , DP [A [X] / = NUM [A [X]; // 부착 난 점이 지적된다 [I] NUM 58 NUM을 [A [X] = 0 , 59 대 ( INT I = head2에서 [A는 [X]를]은 I =! - 1. ]은 I = Edge2은 [I]는 다음 내용) { 60 INT는 Y = Edge2 [I] 전화부; 61은 DP [Y] + = DP [A [X]; 62 NUM [Y] ++ ; 63 } 64 } 65 DP2 [N] = 0 ; 66 대 ( INT , x> = X = N 1 ; x-- ) { 67 의 경우 (! A [X] = N) DP2 [A [X] + = (NUM [A [X] + 1 ) * DP [A [X], DP2 [A [X] / = NUM [A [X]; 68 대 ( INT ! = I - I = head2 [A [X] 1 , I = edge2 [i]는 다음 내용) { 69 INT의 Y = edge2 [I] 전화부; (70) DP2 [Y] + = DP2 [A [X]; 71 NUM [Y] ++ ; 72 } 73 } 74 의 printf ( " % .2lf \ 없음 " , DP2 [ 1 ]); 75 } 76 }