#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; INT m, N, TOT = - 1 , H [ 1005 ], ANS = 0 , TP = 0 ; 구조체 노드 { INT 에서 다음은 휴식하기; int로 마지막; E} [ 10005 ]; 보이드 추가 ( INT의 X, INT Y, INT의 z) { TOT ++ ; E [TOT] 다음 내용 = H [X]; H [X] = TOT; E는 [TOT]. 발 = X; E [TOT] .TO =와이; E [TOT] .rest = Z; } 의 INT DIS [ 1005 ], g [ 1005 ], [유동 1005 ]; 불리언 힘 [ 1005 ]; INT의 BFS ( INT S, INT의 t) { 큐 < INT > Q; DIS [S] = 0 ; 발 q.push; 힘 [S] = 참 ; 반면 (! {q.empty ()) INT U = q.front (); 힘 [U] = 거짓 ; q.pop (); 위한 ( INT 나 H가 = [U]! = I (-1 ) 나는 = 전자 [i]는 다음 내용) { 경우 (DIS [E [I] .TO]> DIS [U] + 1 && g [E [I] .TO] == (- 1 ) && E [I] .rest> 0 ) { g [E [I] .TO] = I; [전자 I] .TO] 유동 = 분 (유량 [U], E [I] .rest); DIS [E [I] .TO] = DIS [U] + 1 ; 경우 (힘은 [E [I] .TO] == 거짓 ) { 힘은 [E는 [I] .TO]는 = 참 ; q.push (E [I] .TO); } } } } } INTEK ( INT S, INT t) { 동안 ( 1 ) { memset 함수 (DIS, 0x7f를 , 는 sizeof (DIS)); memset 함수 (마주, 거짓 , 는 sizeof (마주)); memset 함수 (흐름 에서 0x7f , 는 sizeof (유량)); memset 함수 (g, - 1 , 를 sizeof (g)); BFS (S, t); 경우 (g [t] == (- 1 )) 반환 0 ; ANS + = 유량 [t]; 대한 ( INTp = t, p = (S)! p = E [g [P]. 행 ) { E [g [P] 나머지. - = [t]를 흐르게; E [g [P] 마지막. = TP; E [g [P] ^ 1 ] + = .rest 흐름 [t]; } } } INT 의 main () { memset 함수 (H, - 1 , 를 sizeof (H)); CIN >> >> N m; 위한 ( INT 난 = 1 ; I <= m; I ++ ) { 추가 ( 0 , I, 1 ); 추가 (I, 0 , 0 ); } 대 ( INT I = m + 1 , I <= N; I ++ ) { 추가 (I, N + 1 , 1 ); 추가 (N + 1 , I, 0 ); } INT의 X, Y; 반면 (는 scanf ( " % D % D ' , X, Y) =! {EOF) 추가 (X, Y, 1 ); 추가 (Y, X, 0 ); } EK ( 0 , N + 1 ); 경우 (ANS == 0 ) { COUT << "아니 솔루션! " << ENDL, 종료 ( 0 ) } COUT << ANS << ENDL; }
그런데,이 .... 네트워크 흐름 문제는이 분형 그래프의 최대 매칭 할 것이다
물 위에, 당신은 헝가리에 관심, 또는 네트워크 흐름 맛을 하 할 수있다