1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 CONST INT MAXX = 0x3f3f3f3f 。 4 CONST INT MAXN = 10000 。 5 構造体ノード 6 { 7 INTのU、V、L。 8 ブール 演算子 <(constのノード&A)CONST 9 { 10 リターン L < ら。 11 } 12 }エッジ[MAXN]。 13 INTの父[MAXN]。 14 int型NODENUM、edgenum。 15 ボイドのinit() 16 { 17 のための(int型 I = 0 ; I <NODENUM; iが++ ) 18 { 19 父[I] = I。 20 } 21 } 22 int型の検索(INT X) 23 { 24 ながら(父[X] =!X) 25 { 26 、X = 父[X]。 27 } 28 リターンX。 29 } 30 空隙連合(int型のx、int型のY) 31 { 32 INT temp_x = 探す(X)。 33 int型 temp_y = (y)を探します。 34 であれば(temp_x =!temp_y) 35 { 36 父[temp_x] = temp_y。 37 } 38 } 39 INT クラスカル() 40 { 41 ソート(エッジ、エッジ+ edgenum)。 42 のinit(); 43 ノード今。 44 INT ANS = 0 。 45 のための(int型 I = 0 ; I <edgenum; iが++ ) 46 { 47は 今= エッジ[I]。 48 もし(検索(now.u)=!検索(now.v)) 49 { 50 連合(now.u、now.v)。 51の ANS + = now.l。 52 } 53 } 54の リターンANS。 55 } 56 のint main()の 57 { 58 ながら(scanf関数(" %d個の%のD "、&edgenum、&NODENUM)&& edgenum) 59 { 60 のために(int型 i = 0 ; I <edgenum; ++ I) 61 { 62 のscanf(" %D%D%D "、およびエッジ[I] .U、&エッジ[I] .V、&エッジを[I] .L); 63 } 64 INT ANS = クラスカル()。 65 ブールフラグ= 0 。 66 については、(int型 I = 2 ; I <= NODENUM;私は++ ) 67 { 68 もし(検索(1!)= 検索(i))を 69 { 70 フラグ= 1 。 71 ブレーク; 72 } 73 } 74 であれば(フラグ) 75 { 76 COUT << " ?" << ' の\ n ' ; 77 } 78 他の 79 { 80 COUT << ANS << ' の\ n ' ; 81 } 82 } 83 リターン 0 。 84 }