주제 링크 : http://acm.hdu.edu.cn/showproblem.php?pid=2063
헝가리 증대시키는 경로 알고리즘이 분형 그래프 매칭 문제인가 재귀 알고리즘에 기초한다. 이 문제는이 분형 그래프 애플리케이션의 최대 매칭 헝가리어 알고리즘이다. V1 들어이 x 점에 일치하는, y는 새로운 일치하는 객체가 X의 공식으로 Y를 할 수 있습니다 발견 이상 일치가없는이 시점 경우, 그 시점 일치하는 객체의 잠재적 인 V2의 y로 간주하거나 제공 할 수있다 일치합니다.
(| V | ^ 3) 총 시간 복잡도는 O이고, 그래서 (^ 2 | | V)이 문제 I의 사용은 경로 시간 보강 각 검색이 O 인 인접 행렬이고, 전체 공간 복잡도는 O이며 (| V | ^ 2)가 구현되는 경우, 그 인접리스트 총 시간 복잡도는 O (| V || E가 |), 공간적 복잡도가 O 인 (| E | + | V |).
다음과 같이 코드입니다 :
1 #INCLUDE <비트 / stdc ++ H.> 2 사용 공간은 수 std; 3 타입 정의 부호 INT UI; 4 형식 정의 긴 긴 LL; 5 형식 정의 부호없는 긴 긴 날개 펼진을; 6 #DEFINE PF의 printf 7 #DEFINE MEM (a, b)가 memset (A, B를 sizeof (a)) 8 #DEFINE prime1 1E9 + 7 9 #DEFINE prime2 1E9 + 9 10 #DEFINE PI 3.14159265 11 #DEFINE의 LSON 리터, 미드, RT 1 << 12 #DEFINE의 rson 미드 + 1, R, RT << 1 | 1 13 #DEFINE의 scand는 (X)는 scanf ( "%의 LLF ', X) 14 #DEFINE의 F는 (I는 A, B)에 대한 (INT 나는 A =; I <= B; I ++) 15 #DEFINE 스캔 (a)는 scanf ( "%의 D", a) 16 #DEFINE의 (A, B) make_pair (() 융점, (b)) 17 #DEFINE의 P 쌍 <INT, INT> 18 #DEFINE의 DBG (인수) COUT << # 인수 << ":"<< 인수 << ENDL; 19 #DEFINE INF 0x7ffffff 20 인라인 INT 리드 () { 21 INT의 ANS = 0 , w = 1 ; 22 문자 CH = getchar가 (); 23 일 동안 (!(CH2 == ' - ' ) w = - 1 ; CH = getchar가 ()} (24) 동안 (isdigit에 (CH3)) = ANS (ANS << 3 ) + (ANS << 1 ) + CH- ' 0 ' , CH = getchar가 (); 25 리턴 ANS는 * 승; 26 } 27 INT의 K, N, m; 28 CONST INT maxn = 1e3; 29 INT g [maxn] maxn]; 30 INT m_girl, n_boy; 31 INT 매치 [maxn] reserve_boy [maxn]; // 匹配结果在경기中 32 부울DFS ( INT (X)) // 헝가리어 알고리즘 : X는 증대시키는 경로를 발견하는, 즉, 일치하는 객체 찾는 33는 { 34 인 위해 ( INT I = 1. ; I <= n_boy; I ++ ) 35 { 36 IF (reserve_boy [I! ] && G [X] [I])를 // 소년 I와 물체 (X)를 보존하지 않는 여자 일치 될 수 있고, 전 37 { 38은 = [I reserve_boy] . 1 ; // 소정 소년 내가 X 줄 준비 39 IF (일치! [I] || DFS (경기 [I])) (40) // 두 가지 경우, (1) 소년 내가 일치하는 개체 (2) 소년 쌍 객체는 이제 소년에게 내가 원래 객체를 대체하려고 한 모두 성공적인있다 난 X 넣어 할당 (41)가 { 42 인 일치 [I] = X; // i 번째의 X 대체 쌍 소년 또는 개체에 직접 43은 창 에 해당하는 , 44이다 } 45 } 46이다 } (47) 창 은 false ; // I 페어링 여자 실패 48 } 49 INT 의 main () 50 { 51이다 // 상기 freopen을 ( "input.txt를", "R & LT"표준 입력) (52)가 // freopen을 ( "경우 output.txt", "W", 표준 출력) (53)는 : STD :: 아이폰 OS sync_with_stdio ( 거짓으로 ); 54은 그동안 (는 scanf ( " %의 D ' , K) ==1 && K) 55 { 56 m_girl = (판독) = n_boy (읽기); 57 MEM (g, 0 ); 58 MEM (매치, 0 ); 59 INT U, V; 60 F (I, 1 , K) 61 { 62 유 (읽기 =), V = (판독); 63 g이었다 U]는 [V] = 1 ; // 邻接矩阵存边 64 } 65 INT의 합 = 0 ; 66 F (I, 1 , m_girl) //각 여자 쌍을 찾고, 현재는 대체 될 수 후 성공적인 소녀를 추구하지만, 페어링됩니다 67 { 68 MEM (reserve_boy, 0 ); 69 IF (DFS (I)) SUM ++ ; 70 } (71)는 PF를 ( " % D \ N- " , SUM) (72) } (73)이다 }