최대 된 그래프 매칭 알고리즘을 헝가리

이분 그래프 매칭의 일부 지식 :

경기 : 어떤 공통점 두 개의 측면 (각 지점에되도록, 일부 모서리를 선택
멀티 없다 가장자리-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 }

 

추천

출처www.cnblogs.com/Hoyoak/p/11422798.html