記事の著者:ktyanny 出典:ktyannyは 、指定したあなたに感謝してください再現。
ktyanny:まあ、中国のタイトルは、そのタイトルは多くを言わないについて説明します。最小スパニングツリーを解決するために考えられている表情で。対象は、それがフロート、WA、およびACに倍増するタイプと、少し恥ずかしいと関係し始めて残念です1Yませんでした......
312MS C ++
/ *
ktyannyによる
2009年12月15日
* /
書式#include < stdio.hに >
する#include < STDLIB.H >
書式#include < 文字列 の.h >
の#include < のmath.h >
の#include < iostreamの > 使用して名前空間 はstd; CONSTのINT MAX = 105 。typedef 構造体{ int型 X、Y。ダブル ワット; }エッジ; const int型 MAXN = 50005 ;
エッジE [MAXN];
ダブル ANS;
INT ランク[MAXN];
int型 PA [MAXN];
ボイド make_set( INT X)
{
PA [X] =の X;
ランク[X] = 0 ; } int型 find_set(INT X){ IF (X =! PA [X]) PA [X] = find_set(PA [X]); 戻り PA [X]; } / * プレスランク合わせXセット、Yをここで、* / ボイド union_set(int型 のx、 int型 Y、 ダブル W){
X = find_set(X)、
Y = find_set(Y)、
IF (X == Y) のリターン ;
ANS + = W;
IF (ランク[X] > ランク[Y]) / * 親ノードとして、より高いランクを作りますポイント * /
{
PA [Y] = X;
}
他 { PA [X] = Y; IF (ランク[X] == ランク[Y]) ランク[Y] ++ ; } } int型 CMP(CONST ボイド* A 、
CONST ボイド* B){ リターン ((* (エッジ * )A).W > (* (エッジ * )B).W) ?1 : - 1 。} のtypedef 構造体{ ダブル XX、YY。}ポイント; 点P [ 105 ]。INT のmain(){ int型 N、I、J、JJ、K、X、Y、T、M。文字 CH1、CH2; cinを >> メートル。 一方、(M - ) { CIN
>> N;
J = 0 ; 以下のための(I = 1 ; iが <= N; iは++ ) CIN >> P [i]は.xx >> P [i]は.yy。/ * 处理图的边集* / ダブル 温度; 以下のための(I = 1 ; iが <= N; iは++ ) { ため(K = I; K <= N; kは++ ) { TEMP = SQRT((P [i]は.xx - P [k]は.xx )
* (P [i]は.xx - P [k]は.xx) + (P [i]は.yy - P [k]は.yy) * (P [i]は.yy - P [k]は.yy))。
もし (温度 < 10 || TEMP > 1000年)続けます。他 { E [J] .W = TEMP。 E [J] .X = I; E [J] .Y = K。 J ++ ; } } } のための(I = 0
; I <= N。私は ++ )
make_set(i)を、
qsort(E、J、 はsizeof (E [ 0 ])、CMP)。
/ * Kruscal过程求最小生成树 * /
ANS = 0.0 。以下のための(I = 0 ; iが < jは、iが++ ) { X = find_set(E [I] .X)。 Y = find_set(E [I] .Y)。もし(X != Y) union_set(X、Y、E [I] .W)。 } 場合(ANS > 0
){
ANS * = 100 。 printf(" %.1lfする\ n " 、ANS)。 } 他 のprintf(" ああ、\ nは!" ); } 戻り0 。}
ktyannyによる
2009年12月15日
* /
書式#include < stdio.hに >
する#include < STDLIB.H >
書式#include < 文字列 の.h >
の#include < のmath.h >
の#include < iostreamの > 使用して名前空間 はstd; CONSTのINT MAX = 105 。typedef 構造体{ int型 X、Y。ダブル ワット; }エッジ; const int型 MAXN = 50005 ;
エッジE [MAXN];
ダブル ANS;
INT ランク[MAXN];
int型 PA [MAXN];
ボイド make_set( INT X)
{
PA [X] =の X;
ランク[X] = 0 ; } int型 find_set(INT X){ IF (X =! PA [X]) PA [X] = find_set(PA [X]); 戻り PA [X]; } / * プレスランク合わせXセット、Yをここで、* / ボイド union_set(int型 のx、 int型 Y、 ダブル W){
X = find_set(X)、
Y = find_set(Y)、
IF (X == Y) のリターン ;
ANS + = W;
IF (ランク[X] > ランク[Y]) / * 親ノードとして、より高いランクを作りますポイント * /
{
PA [Y] = X;
}
他 { PA [X] = Y; IF (ランク[X] == ランク[Y]) ランク[Y] ++ ; } } int型 CMP(CONST ボイド* A 、
CONST ボイド* B){ リターン ((* (エッジ * )A).W > (* (エッジ * )B).W) ?1 : - 1 。} のtypedef 構造体{ ダブル XX、YY。}ポイント; 点P [ 105 ]。INT のmain(){ int型 N、I、J、JJ、K、X、Y、T、M。文字 CH1、CH2; cinを >> メートル。 一方、(M - ) { CIN
>> N;
J = 0 ; 以下のための(I = 1 ; iが <= N; iは++ ) CIN >> P [i]は.xx >> P [i]は.yy。/ * 处理图的边集* / ダブル 温度; 以下のための(I = 1 ; iが <= N; iは++ ) { ため(K = I; K <= N; kは++ ) { TEMP = SQRT((P [i]は.xx - P [k]は.xx )
* (P [i]は.xx - P [k]は.xx) + (P [i]は.yy - P [k]は.yy) * (P [i]は.yy - P [k]は.yy))。
もし (温度 < 10 || TEMP > 1000年)続けます。他 { E [J] .W = TEMP。 E [J] .X = I; E [J] .Y = K。 J ++ ; } } } のための(I = 0
; I <= N。私は ++ )
make_set(i)を、
qsort(E、J、 はsizeof (E [ 0 ])、CMP)。
/ * Kruscal过程求最小生成树 * /
ANS = 0.0 。以下のための(I = 0 ; iが < jは、iが++ ) { X = find_set(E [I] .X)。 Y = find_set(E [I] .Y)。もし(X != Y) union_set(X、Y、E [I] .W)。 } 場合(ANS > 0
){
ANS * = 100 。 printf(" %.1lfする\ n " 、ANS)。 } 他 のprintf(" ああ、\ nは!" ); } 戻り0 。}
ます。https://www.cnblogs.com/ktyanny/archive/2009/12/15/1625049.htmlで再現