[BZOJ-1006 및 루오 구 P3196] [HNOI2008] 멋진 나라 - [색칠 - 최대 잠재적 인 MCS 알고리즘]

루오 구가 : 제한 시간은 1.00s  메모리 제한 125.00MB을

시간 제한 : 20 초   메모리 제한 : 1백62메가바이트

주제 링크 : https://www.lydsy.com/JudgeOnline/problem.php?id=1006

루오 구 : https://www.luogu.com.cn/problem/P3196

기술

  K 국가는 날카로운 삼각형 국가, 그들이 그 삼각형 생각 만 사랑의 삼각 원리 사람도 교환입니다 : 즉 AB 상호 이해, BC는 CA를 서로를 알아가
., 알고 서로 삼각 관계를 강화하기 위해 간단하고 효율적이며, K 국가는 금지되어 있습니다 관계 다섯면 관계 소위 N 양면 관계 사방의 존재는 N 개별 A1A2를 지칭하지
(A1A2) (A2A3) ... : 관계 이해해야 만 사이 ...는 N 존재 (AnA1)를, 다른 및 4면 관계가 네 ABCD AB를 의미 같은 관계의 이해, BC는, C
D, DA가 서로를 알고, 게임의 모든 사람들이 부정 행위를 방지하기 위해, 사람들의 쌍 규정 한 팀에서 서로를 알 수 없습니다 때 AC는, BD 몰라 왕이 상을 알고,
분리의 최소 수는 나눌 수 있습니다.

입력

  두 정수의 제 N 라인, M. 1 <= N <= 10000,1 < = M <= 1000000 N은 입력 포인트들의 각 쌍 M 다음 M 라인 사이의 관계를 이해하고, 개인을 표시
친구

산출

  출력 정수, 팀의 최소 번호를 나눌 수 있습니다

샘플 입력

4 5
1 2
1 4
2 4
2 3
3 4

샘플 출력

힌트

  용액 (3) (2) (4)


 

emmm, 알고에 볼 수있는지도가 그래프 색상에 대한 그래프의 최소한의 착색, 인접한 점 당신이 사용할 수있는 방법을 많은 색상을 물어 적어도하지 동일한 색상을 필요로한다는 것이다립니다.

여기에 가장 큰 잠재적 인 알고리즘이있어 다음과 같이 특정 프로세스는 다음과 같습니다

각 지점의 잠재적 1. 시작은 0, 어떤이 삭제 지적이다.

2. 1 점의 전위와의 부착 점을 삭제, 최대 전위 점 삭제 삭제.

모든 지점이 제거 될 때까지 2를 반복합니다.

그래서이 삭제 된 순서, 그리고이 순서는 다른 가능성의 번호를 삭제 나타난 것입니다, 색상의 최소 수는 얼마나이다.

두 번째 테스트 포인트 루오 밸리에서, 다음 시간에 잡히면, BZOJ 문제가 아니라 같은 산소의 최적화를 엽니 다.

다음은 AC 코드입니다 :

#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <큐> 
#INCLUDE <알고리즘>
 사용  공간을 성병; 

CONST  INT의 MAC 1E6 + = 10 ;
CONST  INT MAC2 1E4 + = 10 ; 

구조체 노드 
{ 
    INT 로 옆, w; 
예} [MAC << 1 ];
INT 헤드 [MAC2, CNT = 0 , 힘 [MAC2, 색 [MAC2, 점 [MAC2];
구조체 냄비 
{ 
    INT 발, ID;
    부울  연산자 <( CONST 포트 및 a)CONST {
          브로 < a.val; 
    } 
}; 

보이드 추가 ( INT U, INT V) 
{ 
    예 [ ++ CNT] = {V 노드 머리 [U], 0 }; 
    헤드 [U] = CNT; 
} 

int 형 ) (주 
{ 
    INT를 N, m; 
    scanf와 ( " % D % D " , 및 N, m); 
    memset 함수 (머리 - 1 , 를 sizeof 헤드);
    위한 ( INT 난 = 1 ; I <= m I ++ ) {
         지능U, V; 
        scanf와 ( " % D % D ' , U, 및 V); 
        추가 (U를 V) 추가 (V, U); 
    } 
    priority_queue <냄비> Q; 
    q.push (포트 { 0 , 1 });
    INT ANS = 0 ;
    동안 (! q.empty ()) { 
        냄비 지금 = q.top (); 
        () q.pop; 
        경우 (힘 [now.id]) 계속 ; 
        힘 [now.id] = 1 ;
        INT U = now.id;
        경우 (! 색 [now.val])는 색 [now.val = ans와 ++1 ;
        위한 ( INT 나 머리 = [U] I =! - 1 ] I = 예 [I] 다음 내용) {
             INT의 V = 예 [I] .TO;
            경우 (힘 [V]) 계속 ; 
            포인트 [V] ++ ; 
            q.push (냄비 포인트 {[V], V}); 
        } 
    } 
    의 printf ( " 가 % d \ n " , ANS);
    반환  0 ; 
}

 

 

 

추천

출처www.cnblogs.com/lonely-wind-/p/12191171.html