Description
给出N个点的坐标,对它们建立一个最小生成树,代价就是连接它们的路径的长度,现要求总长度最小。N的值在100以内,坐标值在[-10000,10000].结果保留二位小数
Input
5 ---------------5个点
0 0 ---------------5个点点的坐标
0 1
1 1
1 0
0.5 0.5
Output
2.83
题解:跟最短网络差不多,用克鲁斯卡尔的算法做,读入稍微改一下就行了。
const
maxn=200;
var
a:array[1..maxn,1..maxn] of real;
c:array[1..maxn,1..2] of real;
b:array[1..1000] of longint;
n,i,j,k,x,y,p:longint;
min,t:real;
procedure init;
begin
readln(n);
for i:=1 to n do
readln(c[i,1],c[i,2]);
for i:=1 to n do
for j:=1 to n do
a[i,j]:=sqrt(sqr(c[i,1]-c[j,1])+sqr(c[i,2]-c[j,2]));
end;
begin
init;
for i:=1 to n do b[i]:=i;
for i:=1 to n-1 do
begin
min:=maxlongint;
for j:=1 to n do
for k:=1 to n do
if (b[j]<>b[k]) and (a[j,k]<>0) and (a[j,k]<min) then
begin
min:=a[j,k];
x:=j;
y:=k;
end;
t:=t+min;
p:=b[y];
for j:=1 to n do if b[j]=p then b[j]:=b[x];
end;
writeln(t:0:2);
end.
剑鱼行动-SSL 1618
最新推荐文章于 2021-01-02 21:03:04 发布
