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

D - 交通プロジェクトスムース

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

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

4 2 
1 3 
4 3 
3 3 
1 2 
1 3 
2 3 
5 2 
1 2 
3 5 
999 0 
0

サンプル出力

1 
0 
2 
998

 

巨大な入力は、scanfのが推奨されます。
 
1の#include <iostreamの>
 2  使用して 名前空間STDを、
3  
4  int型の負荷[ 1010 ]。
5  ボイドのinit(){
 6      のためのINT iは= 0 ; I < 1010 ; I ++ 7          ロード[I] = iは、
8  }
 9  
10  int型の検索(INT X){
 11      リターン X ==負荷[X]?X:ロード[X] = (負荷[X])を見つけます。
12  }
 13  
14  空隙 load_union(INT X、INTのY){
 15      、INT FX = (X)を見つけます。
16      INT FY = (y)を見つけます。
17      負荷[FY] = FX。
18  }
 19  
20  int型のmain(){
 21      INT N。
22      一方(のscanf(" %dの"!、&N)= EOF){
 23          であれば(N == 0ブレーク24          のinit();
25          int型 M、X、Y、NUM = 0 26          のscanf(" %d個"、&M);
27          のためにINTは iは= 0 ; I <M I ++ ){
 28              のscanf(" %D%D "、およびX&Y)。
29              であれば((X)=を見つける!load_union(x、y)を見つける(Y))。
30          }
 31          のためにINT iは= 1 ; iが<= N; I ++ 32              であれば(私== 負荷[i])と
 33                  NUM ++ 34          のprintf(" %dの\ n "、num- 1 )。
35      }
 36 }
 

 

 

おすすめ

転載: www.cnblogs.com/0424lrn/p/12220573.html