问题描述
给出N个点的坐标,对它们建立一个最小生成树,代价就是连接它们的路径的长度,现要求总长度最小。N的值在100以内,坐标值在[-10000,10000].结果保留二位小数。
样例输入
5 —————5个点
0 0 —————5个点点的坐标
0 1
1 1
1 0
0.5 0.5
样例输出
2.83
算法讨论
最小生成树的变形,只给点的坐标,让你自己求各边之间的长度,可用两点距离公式(详见程序)。本题使用克鲁斯卡尔算法,核心思想为将每个顶点看做单独的连同分量,找出一条代价最小,并连接两个不同连同分量的边,将后者的连通分量加入到前者里面,直到连通。
const
maxn=100;
var
a:array[1..maxn,1..maxn] of real;
z:array[1..maxn,1..2] of real;
v:array[1..maxn] of longint;
i,j,k,n,p,q:longint;
min,s,t:real;
begin
readln(n);
for i:=1 to n do
begin
read(z[i,1],z[i,2]);
v[i]:=i
end;
for i:=1 to n do
for j:=1 to n do
if i<>j
then a[i,j]:=sqrt(sqr(z[i,1]-z[j,1])+sqr(z[i,2]-z[j,2])); //求两点距离
for k:=1 to n-1 do
begin
min:=maxlongint;
for i:=1 to n do
for j:=1 to n do
if (v[i]<>v[j]) and (a[i,j]<min) and (a[i,j]<>0)
then begin
min:=a[i,j];
q:=i;
p:=j
end;
s:=s+min;
t:=v[p];
for i:=1 to n do
if v[i]=t
then v[i]:=v[q]
end;
write(s:0:2)
end.
pixiv ID:60141148