[난징 2,019 D 네트워크 게임 타이틀] 로봇

주제 링크

위기의 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 }

 

추천

출처www.cnblogs.com/sainsist/p/11443200.html