SSL P1618 剑鱼行动

来源:互联网 发布:ubuntu 了mac主题包 编辑:程序博客网 时间:2024/04/28 01:04

算法:克鲁斯卡尔(Kruskal)
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

解法:
1.先用勾股定理求出第i个点到第j个点的距离并储存在数组中。
2.克鲁斯卡尔(Kruskal)

var    a:array [0..101,0..101] of extended;    v:array [0..101] of longint;    x,y:array [0..101] of extended;    i,j,k,n,t,p,q:longint;    min,ans:extended;begin      readln(n);      for i:=1 to n do          begin              readln(x[i],y[i]);              v[i]:=i;          end;      for i:=1 to n do          for j:=1 to n do              if i<>j then                 a[i,j]:=sqrt(abs(x[i]-x[j])*abs(x[i]-x[j])+abs(y[i]-y[j])*abs(y[i]-y[j]));      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];                                   p:=j;                                   q:=i;                               end;              ans:=ans+min;              t:=v[p];              for i:=1 to n do if v[i]=t then v[i]:=v[q];          end;      writeln(ans:0:2);end.
2 0
原创粉丝点击