HDU 1102の構築道路(互いに素セット)

そこ1からNまで番号が付けられているN村は、であり、あなたはすべての二つの村が相互に接続することができるように、いくつかの道路を構築する必要があります。我々は、AとBとの間の道路が存在する、または接続されているA及びC、及びCとB間の道路が存在するように村Cが存在する場合にのみ場合、2つの村のA及びBは、接続されていると言います。 

我々は、すべての村が接続され、構築されたすべての道路の長さが最小になるように、いくつかの道路のビルドで、いくつかの村や、あなたの仕事の間にいくつかの道路が既に存在していることを知っています。 
InputThe最初の行は、整数N(3 <= N <= 100)、村の数です。次いで、N行は、N個の整数を含むi番目のうち、来て、これらN個の整数のj番目村iと村jの間(距離は[1、1000]の範囲内の整数でなければならない)距離です。 

次に、整数q(0 <= Q <= N *(N + 1)/ 2)があります。次いで、Qラインを来る、各ラインは、2つの整数を含む構築されている村aおよび村B間の道路を意味し、(<= N、B 1 <= A <)およびb。 
OutputYouは、出力ラインは全て道路の長さは、すべての村に接続されるように構築されるべきである整数を含有する必要があり、この値は最小値です。 
サンプル入力
3 
0 990 692 
990 0 179 
692 179 0 
1 
1 2
サンプル出力
179
1の#include <stdio.hの>
 2の#include <iostreamの>
 3の#include <アルゴリズム>
 4の#include < 文字列・H>
 5の#include <キュー>
 6の#include <ベクトル>
 7の#include < ストリング >
 8つ の#define MEM (A、B)のmemset(A、B、はsizeof(a))は 
 9  の#define N 105
 10  の#define MOD
 11  の#define MIN
 12  の#define MAX
 13  使って 名前空間STDを、
14  
15  INT プレ[N]。
16  構造体ノード{
 17      のint X、Y、W。
18 }道路[ 10010 ]。
19  
20  のint Fiの(INT X){
 21      リターンプレ[X] == X X:[X] =予備Fiの(事前[X])を、
22  }
 23  
24  空隙 UNI(int型のx、int型のY){
 25      int型 FX = Fiの(X)、FY = Fiの(Y)
26      であれば(FX =!年度){
 27          プレ[FX] = FY。
28      }
 29  }
 30  ブールCMP(ノードA、ノードY){
 31     返す AW < YW。
32  }
 33  INT メイン(){
 34      のint N、Q、B。
35      一方(scanf関数(" %のD "、&​​N)=!EOF){
 36          int型 CNT = 0 37          のためにint型 i = 1 ; iが<= N; iが++ ){
 38              プレ[I] = I。
39              のためにINT J = 1 ; jは<= nであり、j ++ ){
 40                  のscanf(" %dの"、&​​A )。
41                  であれば(私は< j)を{
 42                      道路[CNT] .X = I。
43                      道路[CNT] .Y = J。
44                      道路[CNT ++] W =。 45                  }
 46              }
 47          }
 48          のscanf(" %dの"、&Q)。
49          のためにint型 I = 0 ; iがQを<; Iは++ ){
 50              のscanf(" %D%dの"、&​​、&B)。
51              UNI(B)
52          }
 53          INT ANS = 0 54          ソート(道路、道路+ CNT、CMP)。
55          のためにint型 I = 0 ; iがCNTを<Iは++ ){
 56              場合(FI(道路[I] .X)=!Fiの(道路[I] .Y)){
 57の                  ANS + = 道路[I] .W。
58の                 UNI(道路[I] .X、道路[I] .Y)。
59              }
 60          }
 61          のprintf(" %d個の\ n " 、ANS)。
62      }
 63 }

テストのWAに数回、私は思った、私は、ああ、はい、そして、よく、複数のセット

おすすめ

転載: www.cnblogs.com/cake-lover-77/p/10949090.html