ある日、アルゴリズムの問題 - フレンズ(互いに素セット)

トピックの背景

暁明A社では、B社は、仕事を赤。

タイトル説明

どちらの従業員は、特性を持っている:会社の従業員は同性愛者です。

同社は、Pの友人のためのNの従業員を持っています。B社は、友人のためのQを含め、Mの従業員を擁しています。特定の友人や友人の友人。

二つの整数(西、李)との友人関係からなる各ペアは、西、李だった友人の数を表します。男子の数が正である、女性の数は負です。ボブは数1であり、赤色数は-1。

我々はすべて知っているように、暁明赤はあなたが計算された2つの企業の間でプログラムを書き、そして、友達であるカップルが処方することができるどのくらいの合計の理解まで暁明によって小さな赤い男。(自分自身を含みます)

入力形式

ライン1は、4つの空間は、N、M、P、Q.整数正により分離しました

2つの正の整数Xiの、李のPラインの後。

2つの負の整数Xiの、李のQラインの後。

出力フォーマット

ラインは、ボブとアリスによって人々を表す正の整数は吹き替えのカップルが合計で最大ことができますどのくらい知っています。(自分自身を含みます)

サンプル入力と出力

エントリー 
4 3 4 2 
1 1 
1 2 
2 3 
1 3 
-1 -2 
-3 -3
輸出 
2

説明/ヒント

30%のためのデータ、N、M <= 100、P、Q <= 200

80%のためのデータ、N、M <= 4000、P、Q <= 10000。

すべてのデータに対して、N、M <= 10000、P、Q <= 20000。

 

このトピックでは、その使用互いに素セットが何を参照してください。

ここでは、互いに素セットが何であるかを見てください。

互いに素なセット:ツリーデータ構造、問い合わせ素集合(互いに素なセット)の数を処理してマージします。多くの場合、表現するために森に使用します。基本的な操作は次のとおりです。初期化、合併および検索。

初期化:定義配列s

1  空隙init_set(){
 2      INT iは= 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(Y、F)。
4      もし(!X = Y)
 5          S [X] = Y。
6 }

その後、我々は、トピックに戻ります。

タイトルの意味によると、我々は、2つの配列とB、A社、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は iは= 1 ; iが<= N; I ++ 9          [I] = I。
10      のためにINT iは= 1 ; iが<= M; I ++ 11          B [I] = I。
12  }
 13  
14 INT find_set(INT X、ブールF){
 15      であれば(F){
 16          であれば([X] = X!)[X] = find_set([X]、F)。
17          リターンA [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(Y、F)。
28      であれば(X =!Y)
 29          であれば(F) 
 30              [X] = Y。
31          他の
32              B [X] = Y。
33  }
 34  
35  INT メイン(){
 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 = 0T2 = 0 47      、P = find_set(1)。
48      Q = find_set(1)。
49      のためにINT iは= 1 ; iが<= N; I ++ 50          であれば(find_set(I、)== P)
 51              T1 ++ 52      のためのINTは iは= 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