Highways--最小スパニングツリーのテンプレートのタイトル(距離追求)

トピックリンク

質問の意味:

頂点の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 ; 
}
クラスカル

 

おすすめ

転載: www.cnblogs.com/j666/p/11616979.html