주제 배경
샤오밍 A 회사에서 B 회사는 작업을 빨간색.
제목 설명
두 직원은 특성을 가지고 회사의 직원이 동성애 있습니다.
한 회사는 P의 친구를위한 N 직원을 가지고 있습니다. 회사 B는 친구를위한 Q를 포함하여 M의 직원을 가지고 있습니다. 특정 친구 또는 친구의 친구.
두 정수 (사이 이순신)와 친구 관계로 이루어진 각 쌍의 친구의 수가 사이 이순신이었다 나타낸다. 남성의 수는 여성의 숫자가 음수, 긍정적이다. 밥은 숫자 1, 적색 번호 -1.
우리 모두 알다시피, 샤오 명나라와 빨간색 당신은 계산 된 두 회사 사이의 프로그램을 작성하고, 친구 부부가 공식화 할 수 있습니다 얼마나 많은 총 이해까지 샤오 밍에 의한 작은 빨간 남자. (자신을 포함)
입력 형식
라인 (1)는 4 개 개의 구역은 N, M, P, Q. 정수 양으로 구분
두 개의 양의 정수 사이 이순신의 P 선 후.
두 음의 정수 사이 이순신의 Q 선 후.
출력 형식
라인, 밥과 앨리스에 의해 사람들을 나타내는 양의 정수 더빙의 부부가 총까지 할 수있는 방법을 많이 알고있다. (자신을 포함)
샘플 입출력
4 3 4 2 1 1 1 2 2 3 1 3 -1 -2 -3 -3
이
설명 / 팁
30 %의 데이터, N, M <= 100, P, Q <= 200
80 %의 데이터, N, M <= 4000, P, Q <= 10000.
모든 데이터가, N, M <= 10000, P, Q <= 20000.
이 항목은 사용하는 분리 된 세트가해야 할 참조하십시오.
여기에서 우리는 분리 된 집합이 무엇인지 살펴 봅니다.
디스 조인트 세트 : 처리 및 문의들을 병합 트리 데이터 구조 세트 (이산 세트)는이 끊긴. 종종 표현하기 위해 숲에 사용합니다. 기본 조작은 다음과 같습니다 초기화, 합병 및 검색.
초기화 : 정의 배열의
1 공극 init_set () { 2 대 ( INT 나 = 1 ; I <= N; I ++ ) 3 S [I] = I; 4 }
찾기 : 루트 노드를 찾을 수 있습니다. (초기화에 따르면, 한 노드 자체, 그것은 루트 노드는 대신에)
1 INT find_set ( INT (X)) { 2 리턴 X == S [X]? X : find_set (S [X]); 3 }
병합 :
1 공극 union_set ( INT의 X, INT Y) { 2 X = find_set (X, F); (3) Y = find_set (예, F); (4) 만약 (X! = Y) (5 개) (S) [X = Y; 6 }
그런 다음 우리는 주제로 돌아갑니다.
제목의 의미에 따르면, 우리는 두 개의 배열 a와 b하는 회사, 회사 B를 정의합니다.
작업을 결합함으로써, 우리는 쉽게 연결 누가 친구를 넣을 수 있습니다.
그런 다음 밥, 앨리스의 친구가 누구인지 결정하는 것입니다, 동일한 친구 밥 사람 T1, T2 인간의 빨간색 노드 루트 모두를 통해 그려집니다
계정 일부일처 제를 고려 , 작은 소년, 바로 어린 소녀 더빙 할 것이다 T2의 권리를 T1 쌍 될 것이다.
오른쪽에있는 분보세요!
1 #INCLUDE <비트 / stdc ++ H.> 2 사용 공간은 수 std; 3 4 INT N, M, P, Q, T1, T2; 5 INT의 A [ 10010 ], B [ 10010 ]; 6 7 공극 init_set () { 8 에 대한이 ( INT가 나는 = 1 ; i가 <= N; I ++ ) 9 A [I] = I; 10 대 ( INT 나 = 1 ; i가 <= m; I ++ ) 11 B [I] = I; 12 } 13 14 INT find_set ( INT (X), 부울 F) { 15 의 경우 (F) { 16 의 경우 (a [X] = X!)는 [X] = find_set (a [X], F); (17) 반송 이 [X]; (18) } (19) 또 { 20 의 경우 (b [X] = X!) (B) [X] = find_set (b [X], F); 21 리턴 B [X]; 22 } 23 } 24 25 공극 union_set ( INT의 X, INT Y, 부울 F) { 26 X = find_set (X, F); (27) Y = find_set (예, F); 28 일 경우 (X! = Y) (29) 의 경우 (F) (30) 이 [X = Y; 31 다른 32 (B) [X = Y; 33 } 34 35 INT 의 main () { 36 CIN >> N >> M, P >> >> Q; 37 init_set (); 38 동안 (p-- ) { 39 CIN >> >> T1 , T2; 40 union_set (T1, T2, 참 ); 41 } 42 동안 (q--) { 43 CIN >> >> T1 , T2; 44 union_set (-T1, -t2, 거짓 ); 45 } 46 (T1) = 0 ; T2 = 0 ; 47 p = find_set ( 1 , 참 ); (48) Q = find_set ( 1 , 거짓 ); 49 대 ( INT 나 = 1 ; i가 <= N; I ++ ) (50) 의 경우 (find_set (I, 참 ) == P) (51) (T1) ++ ; (52) 에 대한( INT가 나는 = 1 ; I <= m; I ++ ) (53) 의 경우 (find_set (I, 거짓 ) == Q) (54) (T2) ++ ; 55 COUT << 분 (T1, T2); 56 반환 0 ; 57 }
최적화는 빠른 읽기로 간주 될 수 확인 및 메모리 어레이 높이 설정의 사용을 최적화 할 수 있습니다.