겨울 Day10 : DP + 트리 이분 그래프 매칭 (헝가리어 알고리즘) 운동

트리 DP

DP [N] [2] :

현재 노드를 선택 또는 선택되지 않은 위해 DP //
// DP [I] [0] // 선택되지
// DP [I] [1] ; // 으로부터 선택된

상태 전이 식 (키) :

위한 ( INT 난 = 0 ; I <V [루트]를 크기는 (); I ++ )
{
  DP [루트] [ 0 ] + DP = [V [루트] [I] [ 1. ]; // 현재 노드가 선택되지 않은 경우, 하위 노드를 선택해야한다 
  [DP [루트] . 1 ] + = 분 (DP [V [루트] [I] [ 1. , DP [V [루트] [I] [ 0 ]); // 현재 노드가 선택된 자식 노드 (선택 / 선택되지 않은) 
}

 

1  // ~ 노드의 수 (N)가 소정의 N-1 0
 2  // 센티넬 노드 각각 센트리가 두 개의 인접한면에서 관찰 각 스테이션
 3  // Q가 최소 개수를 요구 센티넬이 관찰 될 수있다 모든 가장자리 
. 4  
. 5 #INCLUDE < 문자열 .H>
 . 6 #INCLUDE <iostream>
 . 7 #INCLUDE는 <STDIO.H>
 . 8 <알고리즘> #INCLUDE
 . 9 <큐> #INCLUDE
 10 <벡터> #INCLUDE
 . 11 <지도> #INCLUDE
 12은 #INCLUDE <cmath>
 13 인  은 USING  스페이스 STD;
 14  #DEFINE INF 0x3f3f3f3f
 15  #DEFINE inff 0x3f3f3f3f3f3f3f3f
 16  CONST INT N = 1550 ]
 . 17  #DEFINE MOD 998 244 353
 18은 typedef에  LL]
 . (19)  
(20)는  INT ] N-
 (21)는 <벡터 INT > V [N],
 (22)는  INT F [N], DP [N] [ 2 ]
 (23)가  // DP 현재 노드가 선택 여부 선택에 대해
 24  // DP [I] [0] // 옵션 없음
 25  // DP [I] [1.]; // 옵션 
(26)은  공극 DFS ( int로 루트)
 27  {
 28      DP [루트] [ 0 ] =0 ] // 이는 루트 노드로부터 선택되어 있지 않은 
29      [DP [루트] . 1 ] = . 1 ; // 현재 루트 선택 
(30)      에 대해 ( INT I = 0 ; I <V [루트] 크기는 (); I ++ )
 (31)가          DFS ( V [루트] [I]),
 32       ( INT I = 0 I ++; I <V [루트] 크기는 () )
 (33)가      {
 34은          DP [루트] [ 0 ] + = DP [V [루트] [I ]] [ 1 ]; // 현재 노드가 선택되지 않은 경우, 하위 노드로부터 선택되어야한다 
(35)          DP [루트] [ 1 ] + = 분 (DP [V [루트] [I] [ 1, DP [V [루트] [I] [ 0 ]); // 현재 노드가 선택된 자식 노드 (선택 / 선택되지 않은) 
36      }
 37  }
 38 인  
39  INT 주 ()
 40  {
 41은      그동안 (~는 scanf ( " %의 D " , )), N-
 (42)가      {
 43 인          - memset 함수 (F . 1 , sizeof의 (F)는) // . 노드 ID 이후 0 ~ N-- 1 
(44)은          위해 ( INT I = . 1 I <= N-; I ++ )
 45          {
 46은              int로 상기 루트 노드의 아들
 (47)              (는 scanf을" %의 D (%의 D) " , 루트, 노드)
 (48)              V [루트]하는 명확한 (); // 클리어 기억 
(49)              에 대한이 ( INT J = 1. , J <= 노드, J ++ )
 50              {
 51은                  scanf와 ( " %의 D " , 아들)
 (52)은                  V [루트] .push_back (SON) // 방향성 에지 
(53)은                  F [아들] = 상기 루트
 (54)가              }
 55          }
 56는          INT X = 0 ]
 (57)이          그동안 (F [X] ! = -. (1) )
 58              X = F [X]; // 전체 트리의 루트 발견 
59          ; DFS (X)
 (60)          INT 미네소타 = 분 (DP [X] [ 0 ], DP를 [X] [ 1. ])
 (61)는          의 printf ( " % D \ N- " 미네소타)
 62이다      }
 (63)이      복귀  0 ,
 64 }
코드보기

 


 

이분 그래프 매칭 (헝가리어 알고리즘) 운동

 

추천

출처www.cnblogs.com/OFSHK/p/12231729.html