そこ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に数回、私は思った、私は、ああ、はい、そして、よく、複数のセット