루오 구 P3367의 해체 설정된 템플릿 [제목]

제목 설명

언급 한 바와 같이, 당신은 병합 및 쿼리 작업을 완료해야합니다, 지금이 끊긴 세트가있다.

입력 및 출력 형식

입력 형식 :

 

첫 번째 라인은 N, m은, M은 N 원소 및 동작의 전체를 나타내는 두 개의 정수를 포함한다.

다음에 M 행 세 정수 닫아, 사이 이순신을 포함하는 각 행

닫아 1, 사이과 이순신의 결합 된 세트 = 때

닫아 2 = 때 출력 사이과 이순신의 Y 출력하는 경우이고, 동일한 세트에, 그렇지 않으면 N 출력

 

출력 형식 :

 

이와 같이, 닫아 = (2)의 각 동작은, 출력 라인을 가지며, 각 행은 대문자 포함 또는 Y는 N이고

 

샘플 입출력

입력 샘플 # 1 : 
4 7 
2 1 2 
1 2 1 
2 1 2 
1 3 4 
2 1 4 
1 2 3 
2 1 4
출력 샘플 # 1 : 
N 
Y 
N 
Y

설명

시간의 제약 : 1000MS, 128M

데이터 규모 :

데이터의 30 %, N <= 10, M <= 20;

데이터의 70 %, N <= 100, M <= 1000;

데이터 <= 10000, M <= N 200000의 100 %.

 

참고 :

그리고 때 분리 된 세트를 병합하는 방법 수집 및 확인 "루트."

재귀 압축 경로의 사용을합니다.

 

 

다음 AC 코드 :  645ms,  788킬로바이트

사용법 #include <iostream>
 사용  스페이스 성병; 

CONST  INT maxn = 10001 ;
INT N; 

INT의 P [maxn]; 

INT ffind ( INT X) 
{ 
    복귀 P [X] == X? X : P [X] = ffind (p [X]); 
} 

공극 INIT ( INT의 N) 
{ 
    위해 ( int로 I = 1 ; i가 N = <; 내가 ++ ) 
        P는 [를 I] = I; 

} 

공극 uunion ( INT U, INT V) 
{ 
    P [ffind (U)]= ffind (V); 
} 


INT 의 main () 
{ 

    CIN >> N;
    INT T; 
    CIN >> T; 
    초기화 (N); 
    INT의 cmd를;
    int로 U를 V;
    반면 (T-- ) 
    { 
        CIN >> cmd를; 
        CIN >> >> U V;
        만약 CMD (==의 1 ) 
        { 
            uunion (U, V); 
        } 
        다른  경우 (의 cmd == 2 ) 
        { 
            INT (X) =ffind (U);
            INT Y = ffind (V);
            경우 (X == Y) COUT << " Y " << ENDL;
            다른 COUT << " N " << ENDL; 

        } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/YY666/p/11221674.html