HDU - 3635 가중 분리 된 세트

드래곤 볼

원숭이 왕 (WuKong)이 함께 드래곤 볼을 모두를 수집하는 것이 너무 어려운, 그래서 오백 년 후, 드래곤 볼의 수는 예기치 않게 증가 할 것이다.

그의 나라는 N 개의 도시가 세계에서 N 드래곤 볼을 정확히있다. i 번째 도시에서 처음에, i 번째 드래곤 볼에, 신성한 용은 것이다 풋를. 오랜 세월을 통해, 일부 도시 '드래곤 볼 (들) 다른 도시로 이송 될 것이다. 드래곤 볼을 수집하기 위해 비행 후광 클라우드, 마법의 비행 구름을 위해 체력 WuKong 계획을 저장합니다.
WuKong 한 드래곤 볼의 정보를 수집합니다 때마다, 그는 당신에게 그 볼의 정보를 요청합니다. 당신은 볼이 위치한 도시 말해해야하며, 얼마나 많은 용 공은 그 도시에있다, 당신은 또한 볼이 지금까지 전송 된 횟수 그에게 말 할 필요가있다.

입력
입력의 첫 번째 라인은 하나의 양의 정수 T (0 <T <= 100)이다.
N과 Q (2 <N <= 10,000, 2 <Q <= 10000) : 각각의 경우에있어서, 첫 번째 행은 두 정수를 포함한다.
다음 Q 라인의 각각은 사실 또는 다음과 형식으로 질문 중 하나를 포함
  TAB :. A를 같은 도시에있는 모든 드래곤 볼이 도시에서 BTH 볼로 이송 한을 당신은 가정 수있는 두 도시 다르다.
  품질 보증 : WuKong는 X (ATH 공에있는 도시의 ID), Y 및 Z (A 번째 볼의 tranporting 시간) (X 번째 도시에서 공의 수를) 알고 싶어요. (1 <= A, B <= N)
 
산출
테스트 케이스를 들어, 출력 테스트 케이스 번호로 포맷 된 출력 샘플. 그런 다음 각 쿼리 출력에 세 개의 정수가있는 줄은 공백으로 saparated XYZ.
 
샘플 입력
3 3
T 1 2
T 3 2
Q 2
3 4
T 1 2
Q 1
T 1~3
Q 1
 
샘플 출력
사례 1 :
0 1 2 3
사례 2 :
2 2 3 3 2 1
 
     질문의 의미 : 도시에서 N 진주, 나는 내가 진주 주어진다. T : X, Y. 어디 컬렉션 x 및 y에 넣어지게된다. Q : X. 어디 x는 쿼리의 집합입니다 : 콜렉션 X, 요소의 총 수는 X 수집, x는 운동의 수입니다.
    구문 분석 : 컬렉션에 직접 뿌리를 찾을 수 X. 컬렉션의 요소 수 (X) 여기서, 직접 모든 [] 배열은 합병시에 유지된다.
      이동 X 횟수를 계산하는 방법을 중요합니다. 샘플 2는도 13에 접속 한 후 트리 1 2 1 2 3.1 관련되고, 실제 접속이 3 팀 [2] ++하지만 팀 [1] 변하지 않았다. 업데이트에 따라서 값이 추가되는 팀 찾기 () : 팀 [X] + = 팀 [PR [X]. 모바일 노드의 수는 휴대 전화 번호 + 루트 노드 자체입니다. 그 조상은 미래 세대에 전송의 수를 증가, 백업 할 수 있습니다. 그리고 코드는 여전히 의미의 조금으로 가입 () 팀에서 ++ [FA] 첫째, FA 팀의 후손 [] 업데이트로 다음 작업을 남겨 다루고 있습니다.
사용법 #include <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <알고리즘> 
#INCLUDE < 세트 >
 사용  스페이스 성병;
CONST  INT maxn = 2e4 + (10) ;
INT PR [maxn, 모든 [maxn, 팀 [maxn];
INT의 N, m;
공극 초기화 () 
{ 
    위한은 ( INT가 나는 = 1 ; I <= N; I ++ ) 
    { 
        PR [I] = I; 
        모든 [I] = 1 ; 
        팀 [I] = 0  ;
    }
} 
INT의 발견 ( INT (X)) 
{ 
    경우 (X == PR [X])
         X;
    INT FA = PR [X]; 
    PR [X] = 찾기 (PR [X]); 
    팀 [X] + = 팀 [FA];
    반환 [X] PR; 
} 
공극 (가입 int로 A, INT의 B)을 
{ 
    INT FA = (a), FB를 찾는 = (b) 검색;
    만약 (! FA = FB) 
    { 
        PR [FA] = FB; 
        모든 [FB] + = 모든 [FA]; 
        팀 [FA]++ ; 
    } 
    반환 ; 
} 
INT 의 main () 
{ 
    INT t;
    INT AC = 1 ; 
    scanf와 ( " %의 D " , t);
    반면 (t-- ) 
    { 
        의 printf ( " 케이스가 % d : \ n " , AC ++ ); 
        scanf와 ( " % D % D " , 및 N, m); 
        초기화 (); 
         CH [ 5 ];
        반면 (M-- ) 
        { 
        //     는 scanf ( "%의 C", CH);
            scanf와 ( " % S " , CH);    
            INT X, Y;            
            경우 (CH [ 0 ] == ' T ' ) 
            { 
                는 scanf ( " % D % D ' , X, Y); 
                (X, Y)에 가입; 
            } 
            다른 
            { 
                는 scanf ( " %의 D ' , X);
                INT의 중간 = (x)를 찾을; 
                COUT << 중간 << "  " << 모든 [미드] << << 팀 [X] << ENDL; 
            } 
        } 
    } 
}

 

추천

출처www.cnblogs.com/liyexin/p/12649957.html