최대 독립 집합 템플릿을 추구 이분 그래프

의 #pragma GCC의 최적화 (2)
 의 #pragma GCC의 최적화 (3)
 의 #pragma (4) GCC의 최적화 
#INCLUDE <비트 / stdc ++. H>
 #DEFINE는 LL 긴 긴
 #DEFINE의 LD 긴 이중
 #DEFINE의 ULL 부호 긴 긴
 #DEFINE의 인터넷 제
 #DEFINE SE 제
 #DEFINE MK make_pair
 #DEFINE PLL 쌍 <LL, LL>
 #DEFINE의 PLI 쌍 <LL, INT>
 #DEFINE PII 쌍 <INT, INT>
 #DEFINE SZ (X) ((INT) x.size () )
 #DEFINE ALL (x)를 (x)를 .begin (), (X) .END ()
 #DEFINE FIO IOS :: sync_with_stdio (거짓); cin.tie (0); 사용

 네임 스페이스 표준; 

CONST의  INT의 N = 5000 + 7 ;
CONST  INT INF = 0x3f3f3f3f ;
CONST LL = INF 0x3f3f3f3f3f3f3f3f ;
CONST  INT 개조 = 998,244,353 ; 

CONST   EPS 1e- = 8 ;
CONST  이중 PI ACOS = (- 1 ); 

서식 < 클래스 T, 클래스 S> 인라인 공극 추가 (T & A, S의 b) {A = B +; 경우 (a> = 개조) A - = 개조} 
템플릿< 클래스 T, 클래스 S> 인라인 공극 부 (T & A, S의 b) {A - = B를; 경우 (A < 0 )은 + = 개조} 
템플릿 < 클래스 T, 클래스 S> 인라인 BOOL chkmax (T & A, S B)는 { 반환 은 <B를? A = B,  : 거짓 } 
템플릿 < 클래스 T, 클래스 S> 인라인 부울 chkmin (T & A, S의 b) { 반환 A> B를? A = B,  : 거짓 }

mt19937 RNG (크로노 :: steady_clock : 지금 () time_since_epoch () COUNT ()..); 

벡터 < INT > G [N]; 
벡터 < INT > RG [N]; 

INT L [N] totL;
INT R [N] totR;
불리언 힘 [N];
INT matchL [N] matchR [N];
불리언 visL [N] visR [N]; 
벡터 < INT > V; 

INT 경로 ( INT U) { 
    visL는 [U]가 = ;
     (자동 및 {G [U] v)의
         경우 (! visR [V]) { 
            visR [V]= 진정한 ;
            경우 (matchR [V] == 0 || 경로 (matchR [V])) { 
                matchR [V] = U; 
                matchL [U] = V;
                반환  1 ; 
            } 
        } 
    } 
    반환  0 ; 
} 

INT 의 main () { 
    
    INT에서 CNT = 0 ;
    위한 ( int로 I = 1 ; I <= totL; 내가 ++ ) { 
        memset 함수 (visL, 0 , sizeof 연산자  (visL));
        memset 함수 (visR, 0, 는 sizeof (visR));
        경우 (경로 (Ⅰ)) { 
            CNT ++ ; 
        } 
    } 

    CNT = N - CNT; 

    memset 함수 (visL, 0 , 는 sizeof (visL)); 
    memset 함수 (visR, 0 , 는 sizeof (visR)); 

    위한 ( int로 I = 1 ; I <= totL; 내가 ++ ) {
         경우 (! {matchL [I]) 
            경로 (Ⅰ); 
        } 
    } 

    에 대해 ( int로 I = 1 ; I <= totL; 내가 ++ ) {
        경우 (visL [I]) { 
            V.push_back (L [I]); 
        } 
    } 

    에 대해 ( int로 I = 1 ; I <= totR; 내가 ++ ) {
         경우 (! {visR [I]) 
            V.push_back (R [I]); 
        } 
    } 

    의 printf ( " % D \ 없음 " , CNT);
    위한 ( int로 I = 0 ; I는 SZ (V) "; 나는 ++ ) { 
        printf와 ( " % d 개 %의 C ' , V를 [I], " \ n " [I == SZ (V) - 1 ]); 
    } 

    반환 0 ; 
} 

/ * 
* /

 

추천

출처www.cnblogs.com/CJLHY/p/11289578.html