제목 설명
언급 한 바와 같이, 당신은 병합 및 쿼리 작업을 완료해야합니다, 지금이 끊긴 세트가있다.
입력 및 출력 형식
입력 형식 :
첫 번째 라인은 N, m은, M은 N 원소 및 동작의 전체를 나타내는 두 개의 정수를 포함한다.
다음에 M 행 세 정수 닫아, 사이 이순신을 포함하는 각 행
닫아 1, 사이과 이순신의 결합 된 세트 = 때
닫아 2 = 때 출력 사이과 이순신의 Y 출력하는 경우이고, 동일한 세트에, 그렇지 않으면 N 출력
출력 형식 :
이와 같이, 닫아 = (2)의 각 동작은, 출력 라인을 가지며, 각 행은 대문자 포함 또는 Y는 N이고
샘플 입출력
설명
시간의 제약 : 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 ; }