이분 그래프 매칭의 일부 지식 :
경기 : 어떤 공통점 두 개의 측면 (각 지점에되도록, 일부 모서리를 선택
멀티 없다 가장자리-A에 속하는)
최대 일치 : 가능한 한 에지 개수를 선택
완벽하게 일치 : 모든 지점이 일치하는 (각 지점은 정확히 하나의 가장자리에 속한 )
와 일치하는 에지 : 선택된 가장자리
일치하지 않는 가장자리 : 선택하지 않는 에지의
매칭 점 : 점 선택된 연결 가장자리
비 정합 점수 포인트와 가장자리가 선택된 접속을하지
헝가리어 알고리즘 :
헝가리어 알고리즘의 핵심 알고리즘은 경로를 보강 찾을 수 있습니다, 각각의 경로는 대답을 더한를 보강 찾을 수 있습니다.
경로 보강 :
그것은 이러한 경로는 경로 보강라고, 2, 4, 3, 5 대신에 사용될 수있다.
알고리즘 과정 :
경기에 대한 첫 번째 세트 포인트에서 왼쪽 시작
에지의 중간 지점이 그것을 일치 일치하지 않은 경우, 별도로 보강 경로의 존재 여부를 본다.
프로세스의 보강 경로를 보면 실제로 일치시킬 수 있습니다 엔드 포인트의 다음 세트에 적합한 일치를 찾는 동안 일시적으로 취소 페어링 된 엔드 포인트의 컬렉션을 왼쪽으로 너무 재 일치의 과정이다
당신이 보강 경로가 찾아 낼 수있는 경우에, 그렇지 않으면 존재하지 않습니다.
코드 일치하는 섹션
1 인라인 부울 DFS ( INT의 POS) 2 { 3 대 ( int로 I = 제 [POS] I, I = 가장자리 [I] .nxt) -4- { 5 INT의 E = 가장자리 [I] .ed; (6) 의 경우 (! 사용 [E]) 7 { 8 [E]를 사용 = 참 ; 9 경우 (매치 [E] ||! DFS (E)) 10 { 11 매치 [E] = POS; (12) 반환 사실 ; 13 } 14 } 15 } 16 }
헝가리 알고리즘 코드
1 #INCLUDE <cstdio> 2 #INCLUDE <iostream> 3 #INCLUDE <CString을> 4 #INCLUDE <알고리즘> 5 #DEFINE의 maxn 2,005 6 7 이용한 스페이스 성병; 8 9 구조체 노드 10 { 11 INT의 ED, NXT; 12 }; 13 노드 에지 [maxn * maxn]; 14 INT의 N, m, 즉, 제 [maxn, ANS, CNT; 15 BOOL [maxn] 사용; 16 INT의 매치 [maxn]; 17 18 인라인 무효의 add_edge ( int로 ST, INT의 ED) 19 { 20 CNT를 ++ ; 21 가장자리 [카본 나노 튜브 = .ed 에드; 22 가장자리 [CNT] = .nxt 제 [일]; 23 [세인트 우선 = CNT 단계; 24 복귀 ; 25 } 26 27 인라인 부울 DFS ( INT의 K) 28 { 29 대 ( int로 I = 제 [K]! I = 0 ; I = 가장자리 [I] .nxt) 30 { 31 INT의 E = 가장자리 [I] .ed ; 32 의 경우 (! [E]를 사용) 33 { 34 중고 [E]가 = 참 ; 35 의 경우 (매치 [E] ||! DFS (매치 [E])) 36 { 37 매치 [E] = K; (38) 반환 사실 ; 39 } 40 } 41 } 42 반환 거짓 ; 43 } 44 45 INT의 주 () 46 { 47 는 scanf ( " % D % D % D ", N, m, E); (48) 에 대한이 ( 값 int = 1을 1 ] 나가 전자 = <; 내가 ++ ) 49 { 50 INT ST, ED; 51 는 scanf ( " %의 D % d에 " , ST, 및 ED); 52 의 경우 (세인트 <= N && ED <= m)의 add_edge (ST, ED); 53 } 54 대 ( int로 I = 1 난 ++; i가 N = < ) 55 { 56 memset 함수 (사용 거짓 , 는 sizeof (사용)); 도 57은 경우 (DFS (ⅰ)) ++ ans와 ; 58 } 59 의 printf ( " %의 D " , ANS); 60 반환 0 ; 61 }