hdu2063 헝가리어 알고리즘 된 그래프 문제 해결책 일치

주제 링크 : 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)이다 }

 

추천

출처www.cnblogs.com/randy-lo/p/12596027.html