私は、我々はすべての場所「百アイランドレイク、」バー、彼らは計画ボートによって達成されなければならない他の島に行きたいとき百件の島々湖は、別の島に住んでいる住民のことを聞いたと信じています。今、政府は百件の島々湖を開発することを決定し、我々は最初の開発の問題を解決しなければならない、もちろん、交通問題で、政府は湖の完全な妨害を受けない百の島々を実施することを決定しました!状況の検査チームのRPRushが完全に百件の島々湖を理解するためにした後、島の条件の遵守の間に橋を建設することを決定し、資格いわゆるつまり、二つの島の間の距離が10メートル未満にすることはできません、それは千メートルを超えることはできません。もちろん、お金を節約するために、唯一の島につながる任意の2つの道路の間で達成することが必要とされています。どのブリッジ価格は100元/ mです。
入力は、入力データの複数のセットを含みます。第一の入力整数T(T <= 200)、T-基を表すデータを含みます。
データの各セットは、C(C <= 100)、島の数の代表は、グループC、各島の代表座標を座標に続く最初の整数であり、これらの座標は、0 <= xであり、Y <= 1000年整数。
出力は、入力データ出力ラインの各セットは、ブリッジの最小コスト、小数点以下1桁に結果を示します。あなたは完全な流れに到達するために、プロジェクトを実現することができない場合は、出力「ああ!」。サンプル入力
2 2 10 10 20 20 3 1 1 2 2 1000~1000
サンプル出力
1414.2 ああ!
アイデアは、ポイントをリンクするために常に貪欲、非常に簡単です。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define INF 0xfffffff int型のn; ダブル D [ 105 ] [ 105 ]。 int型 VIS [ 105 ]。 ダブル分; 二重 DIS [ 105 ]。 構造体ZB { int型 のX; int型のyを。 } [ 105 ]。 二重 DIST(int型 Iを、INT J) { 戻り SQRT(([I] .xa [J] .X)*([I] .xa [J] .X)* 1.0+([I] .ya [J] .Y)*([I] .ya [J] .Y)* 1.0 )。 } ボイドのinit()// 初始化各个变量! { ため(int型 i = 1 ; iが<= N; iが++ ) { scanf関数(" %d個の%のD "、および[I] .X、&[I]・Y) ; } のための(int型 I = 1を I ++; iが<= N ) のための(INT J = 1 ; J <= nであり、j ++ ) { D [i] [j]は、D [j]を= [I] = DIST(I、 J); もし(D [i]は[J] < 10 || D [i]は[J]>1000年) 、D [i]は[J] = D [j]は[I] = INF。 } のために(int型 i = 1 ; iがn = <; iは++ ) DIS [I] = D [ 1 ] [i]は、 memsetの(VIS、0、はsizeof (VIS))。 VIS [ 1 ] = 1 。 } int型のmain() { int型のT、T。 ダブル分; scanf関数(" %のD "、&T)。 一方、(T-- ) { int型のk = 1; ダブル S = 0 ; scanf関数(" %のD "、&N) その中に(); T = 0 。 以下のために(int型 i = 1 ; iがn <I ++の) { 分 = INFと、 用(INT J = 1 ; J <= nであり、j ++ ) { 場合(!VIS [J] &&(DIS [J] < 分)) { 分 = DIS [J]。 K =J; } } もし(分== INF) ブレーク。 トン ++ ; VIS [K] = 1 。 S + = 分。 用(INTの J = 1 ; J <= N; J ++ ) 場合(!VIS [J] &&(DIS [J]> D [j]が[K])) DIS [J] = D [j]と[K]。 } もし(Tの== N- 1 ) { のprintf(" %の.1lfする\ n "、S *100 )。 } 他 のprintf(" ああ、\ nは!" ); } 戻り 0 。 }