어느 날 알고리즘 문제 - 친구 (분리 된 세트)

주제 배경

샤오밍 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 }

 

최적화는 빠른 읽기로 간주 될 수 확인 및 메모리 어레이 높이 설정의 사용을 최적화 할 수 있습니다. 

추천

출처www.cnblogs.com/zyyz1126/p/12526760.html