POJ 3041 소행성 (최대 매칭 된 그래프)

### 항목 링크 ###

효과에 따라 :

그리고 N * N dpi로 K 소행성이있다, 당신에게 N K를 제공합니다. 상처가 옆으로 또는 수직으로 무기를 절단하고, 최소한의 절단, 모든 행성이 파괴됩니다 얼마나 많은 시간을 요구 할 수있다.

 

분석 :

1 ~ N 행의 수는 칼럼의 우측 세트에 합류 할 수 N 세트 1 남아 덧붙였다. 방향성 에지는 이분 그래프에 연결되어있는 모든 지점이어서 주어진다.

도 1에서, 각 측면에 대해, 한 종점 중 하나가 선택 될 때, 유성 나타낸 문서 측이 파괴 될 수있다. 이 엔드 포인트를 선택하면 마찬가지로,이 엔드 포인트에 대한 모든 연결은 한 번에 모든 행성이 파괴 될 것이다.

도 2를 참조하면, I는 선택된 --- (왼쪽 세트 1) (오른쪽 세트)이 에지를 가정 시료에 대해, 다음 I 첫번째 컬럼 또는 수직으로 잘라 잘라 옆의 첫 번째 행을 선택했다. 연결된 모든 에지는 1 공감 (오른쪽 집합)에 대해, 아스테로이드 것 나타내는 따라서 제거되고 1 (왼쪽 세트).

두 엔드 포인트 A 및 B는 선택된 에지에 대응하고, 다른 선택된 측면 B, 그리고 A와 B에 대한 다른 측면에 관련 될 필요가 선택 될 필요는 없다 :는 것을 알 수있다.

따라서이 문제의 본질은 문제의 숫자가 최소 점으로 덮여 있다는 것입니다.

최소 범위 문제는 : 포인트의 최소 수를 찾을 수 있습니다, 그래서 모든 측면을 가질 수있는 숫자는 적어도 하나의 엔드 포인트를 선택되었습니다. 그것은 선택된 지점에서, 단연이 시점 덮어 것을 의미한다.

이어서 된 그래프는 최소 된 그래프에 따르면 최대 매칭 동등하다. 

사용법 #include <iostream> 
#INCLUDE <알고리즘> 
#INCLUDE < 문자열 .H>
 #DEFINE maxn 1,008
 사용  스페이스 성병;
int로 N, m, 즉, 카본 나노 튜브;
INT의 헤드 [maxn];
INT의 CX [maxn, CY [maxn];
불리언 힘 [maxn];
구조체의 가장자리 
{ 
    INT 에;
    INT 다음; 
} 에지 [maxn * maxn]; 
인라인 공극 추가 ( INT U, INT V) 
{ 
    에지 [ ++ CNT] .TO = V; 
    에지 [CNT] 다음 내용 =헤드 [U]; 
    헤드 [U] = CNT;
    반환 ; 
} 
인라인 INT DFS ( INT U) 
{ 
    위해 ( int로 난을 머리 = [유] I, I = 가장자리 [i]는 다음 내용) {
         INT의 V = 가장자리 [I] .TO;
        만약 (! {힘이 [V]) 
            힘이 [V] = ;
            경우 (CY [V] == 0 || DFS (CY [V])) { 
                CX [U] = V; 
                CY [V] = U;
                반환  1 ; 
            }
        } 
    } 
    반환  0 ; 
} 
INT 의 main () 
{ 
    // = freopen을 ( "testdata로 (7) .IN", "R", 표준 입력); 
    scanf와 ( " %의 D % d에 " , N, m);
    INT A, B;
    위한 ( int로 난 = 1 ; i가 <= m; 내가 ++) {는 scanf ( " % d 개 %의 D ' , A, 및 B)이, 추가 (A, B)}
     INT ANS = 0 ;
    위한 ( int로 I = 1 ; i가 <= N; 내가 ++ ) {
         경우 (! CX [I]) {memset 함수 (힘, 0 ,) (오전) 세 + =DFS (I);} 
    } 
    의 printf ( " % D \ 없음 " , ANS); 
}

 

추천

출처www.cnblogs.com/Absofuckinglutely/p/11365265.html