【SSLGZ 1618】剑鱼行动

问题描述
给出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]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.

【SSLGZ 1618】剑鱼行动_第1张图片
pixiv ID:60141148

你可能感兴趣的:(最小生成树)