互いに素セット-B - 円滑な交通プロジェクト

説明

既存のテーブルを取得するための都市交通の地方の調査では、都市部の道路は、テーブルには、都市や町に直接接続された各道路を示しています。ターゲット州政府「円滑な交通プロジェクト」(あなたが道路を介して間接的に相互に到達できる限り、必ずしも直接道路に接続していない)任意の2つの町の間で地域がトラフィックを実装できるようにすることです。最小も構築する必要がありますどのように多くの道路尋ねましたか? 

  

入力

テスト入力には、いくつかのテストケースが含まれています。各テストケースは、町N(<1000)と道路番号Mの数であり、最初の2つの正の整数の列が与えられ、次のMパスに対応するM個の行は、各列は、正の整数の組が与えられ、それぞれ、数直接通信経路における2つの町。簡単にするため、町は1からNまでの番号 
注:道路の数が2つの都市の間で通信することができる、すなわち、 
3 3 
1 2 
1 2 
2 1 
この入力が有効である 
Nが0である場合、入力端、ユースケースが処理されません。 

  

出力

各テストケースのために、出力中の少なくとも1つの行における道路の数は、構成を必要としました。 

  

サンプル入力

 4 2

1 3

4 3

3 3

1 2

1 3

2 3

5 2

1 2

3 5

999 0

  

サンプル出力

 1

0

2

998の 
アイデア、およびチェックの収集、およびマイナス1のセットの数を調べるには、答えです。

書式#include <cstdioを>
 使用して 名前空間はstdを、
 
const  int型 MAXN = 3E4 + 5 INT [MAXN]事前; 
 
INT(見つけるINT X)
{ 
    リターン予め[X] == X?X:(予備[X])を見つけます。
} 
 
ボイドは、(参加INT X、int型のY)
{ 
    X = 検索(X)を、
    Y = 検索(Y)。
    もし(!X = Y)予め[Y] =のX。    
} 
 
int型のmain()
{ 
    int型 N、M、ANS、I、J、K、モミ、得ます一方、(scanf関数(" %d個の%のD "、&​​N、&M)、N)
    { 
        ANS = 0 (i = 1 ; iが<= N; iは++ 
        { 
            事前[I] = I。
        } 
        のための(i = 1 ; I <= M; iは++ 
        { 
           scanf関数(" %D%dの"、&​​K、&FIR)。
           (K、FIR)加入。
        } 
        ため(i = 1 ; iが<= N; iは++ 
        { 
            場合((Iを見つける。)==ⅰ)
                ANS ++ ; 
        } 
        のprintf(" %d個の\ n "、ans- 1 )。
    } 
    戻り 0 
}

 

 

テンプレート

#include <ビット/ STDC ++ H.> // 圧縮パス
使用して 名前空間STDと、
 の#define MAX_N 10000
 INT PAR [MAX_N];
 INTランク[MAX_N]; // ツリーの高さが
無効 INITを(INT N-)//が初期化
{
     ためINT = I 0、I <N - 、I ++ 
    { 
        PAR [I] = I; 
        ランク[I]は = 0 ; 
    } 
 } 
 
int型の検索(INT X)// クエリツリールート
{
     リターン?PAR [X-] == X-X-:PAR [X-] == 検索(PAR [X-]);
 //     int型R = X-;
 //     しばらく(PAR [R] = R!)
 //         R = PAR [R ];
         // クエリ:Xのルート返す
 //     INT X = I、Jを;
 //     一方(I = R&LT!)
 //     {
 //         [I] J = PAR
 //         私は[PAR ] = R&LT;
 //         I = J;
 //     }
 //    R&LTを返す; 
} 
 
ボイドユナイト(int型 X、int型 Yの)//を合わせ、X、Yの組に
{ 
    X = (X)を検索し; 
    Y =(Y)を求める。
     IF(X =!Y)
    PAR [Y] = X;
 //     IF(X == Y)のリターン;
 //     (ランク[X] <ランク[Y])IF
 //     {
 //         PAR [X] = Y;
 //         
//     }
 // //     {
 //         PAR [Y] = X;
 //         IF(ランク[X] ==ランク[Y])
 //         ランク[X] ++;
 //         
//     } 
} 
 
BOOL同じ(int型のx、int型の Y)//はxおよびyは同じセットにある決定
{
     戻り検索(X)==(Y)を見つける; 
} 

int型のmain()
{ 
    ため(I = 1 ; I <= N-Iは++)// :開始またはゼロからの要求の対象からノート
    { 
            PAR [I] = ; I 
    } 
//     」(システムPAUSE「); 
    戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/lanclot-/p/11112348.html