アイデア:まず、2次元アレイはDIS [] []道路の入力処理が修復された、その対応するDIS [i]が[j]はゼロに設定されます。そして、最終的に
すべてのDIS [] []ツリーアルゴリズムスパニングクラスカル最小値を用いて得られた、側構造体を保存します。
1の#include <iostreamの> 2の#include <ベクトル> 3の#include < ストリング > 4の#include <cmath> 5の#include < 設定 > 6の#include <アルゴリズム> 7の#include <cstdioを> 8の#include <地図> 9#含む<CStringの> 10 11 使って 名前空間STDを、 12の 13 のint DIS [ 110 ] [ 110 ]。 14 構造体のエッジ 15 { 16 int型A、B。 17 INTコスト; 18 }、エッジ[ 1000010 ]。 19 20 INTツリー[ 110 ]。 21 22 INT FindRootで(INT X) 23 { 24 であれば(ツリー[X] == - 1 ) 25 リターンX。 26 INT TMP = FindRootで(ツリー[X])。 27 ツリー[X] = TMPと、 28 リターンTMP; 29 } 30 31 ブールCMP(エッジE1、エッジE2) 32 { 33 リターン e1.cost <e2.cost; 34 } 35 36 のint main()の 37 { 38 INT N。 39 のscanf(" %d個"、&N) 40 のために(int型 i = 1 ; iが<= N; ++ I) 41 [I] =ツリー- 1 。 42 43 のために(int型 i = 1 ; iは= N <++ I) 44 のための(INT J = 1 ; J <= N; ++ j)は 45 のscanf(" %のD "、&DIS [I] [J])。 46 47 int型Q; 48 のscanf(" %dの"、&Q)。 49 のために(int型 I = 1 ; I <= Q; ++ i)が 50 { 51 int型A、B。 52 のscanf(" %D%dの"、&、&B)。 53の DIS [A] [B] = 0 。 54 } 55 56 のint、K = 1 。 57 のために(int型私は= 1。 ; I <= N; ++ I) 58 のための(int型 J = 1。 ; J <= N-; ++ J) 59 { 60 IF(J = I &&私はJを<)! //が同じことに注意してください保存側を繰り返さないでください! 61は 、{ 62である エッジ[K] II.A = ; I 63である エッジ[K] .B = J; 64 エッジ[K] = .cost DIS [I]、[J]; 65 ++ K; 66 } 67 } 68 替え( +エッジ1、エッジ+K、CMP)。 69 INT ANS = 0 ; 70 のために(int型 I = 1 ; I <K; ++ I) 71 { 72 INT RA = FindRootで(エッジ[I] .A)。 73 INT RB = FindRootで(エッジ[I] .B)。 74 であれば(RA =!RB) 75 { 76 ツリー[RA] = RB。 77の ANS + = エッジ[I] .cost。 78 } 79 } 80 81 のprintf(" %d個の\ nを" 、年) 82 83 リターン 0 ; 84 }