質問の意味:
頂点のn個の座標指定された二次元座標系は、m個のグループの間の頂点は0の距離を有し、すべての距離の二つの座標の最小スパニングツリーの出力側は0ではありません
ソリューション:
最低限のスパニングツリー・ボード
これは、任意の2点間の距離のみを必要とすることができ
コード:
#include <iostreamの> する#include <stdio.hに> する#include <math.h>の 書式#include <アルゴリズム> の#include <ベクトル> 使用して 名前空間STD。 typedefの長い 長いLL。 const int型 MAXN = 750 + 10 。 const int型 MAXM = 5E5; INT [MAXN] F。 INT X [MAXN]、Y [MAXN]。 int型CNT、M、N。 構造体ノード { int型Uを、V。 ダブルワット; ブール 演算子 <(constのノード&A)のconst { リターン <W AW。 } }エッジ[MAXM]。 INT検索(int型X) { 戻り X == F [x]はx:F [X] = 検索(F [X])。 } ボイド追加(INT U、INT V、ダブルW) { エッジ[CNT] .U = U。 エッジ[CNT] .V = V。 エッジ[CNT。++]、W = W。 } ボイドクラスカル() { int型の和= 0 。 以下のための(int型私は=0 ; I <= N。私は、[I] = F)++ I。 ソート(エッジ、エッジ + CNT)。 以下のために(int型 i = 0 ; iはCNT <I ++の) { int型のx = エッジを[I] .U。 INT Y = エッジ[I] .V。 int型の FX = (x)の検索; int型 FY = (y)を見つけます。 もし(!FX = FY) { F [FX] = FY。 合計 ++ ; もし(エッジ[I] .W> 0)のprintf(" %D%D \ n "、x、y)は、 } であれば(和== N- 1)ブレーク。 } } ダブル get_dis(int型 I、int型のJ) { 二重のDIS =のSQRT((X [I] -x [J])*(X [I] -x [J])* 1.0 +(Y [I] -y [J])*(Y [I] -y [J])* 1.0 )。 // printfの( "%2Fの\ nを。"、DIS); 返すDISを。 } int型のmain() { scanf関数(" %のD "、&N) CNT = 0 ; 以下のための(int型 I = 0; I <= N。私は、[I] = F)++ I。 以下のために(int型私= 1 ; iが<= N; iが++)のscanf(" %D%D "、およびX [i]は、&Y [I])。 以下のために(int型 i = 1 ; iは= N <I ++)のための(INT J = iは+ 1、J <= nであり、j ++ ) { 二重のDIS =のget_dis(i、j)は、 (I、J、DIS)を追加します。 } のscanf(" %dの"、&M)。 ながら(M-- ) { int型、B。 scanf関数("%D%D "、&、&B) 、(A、B を追加0 ); } クラスカル(); 戻り 0 ; }