효과에 따라 :
그리고 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); }