您的位置:首页 > 其它

剑鱼行动

2017-03-25 11:09 471 查看
剑鱼行动
Time Limit:10000MS  Memory Limit:65536K

Total Submit:93 Accepted:79
Case Time Limit:1000MS
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

Sample Input



Sample Output



Source
zju

这一题和最小生成树一样。但输入变一下,输出保留两位小数、

var   

  n,i,j,k,t:longint;

  min,ans:real;

  x,y,v:array[0..101]of real;

  a:array[0..101,0..101]of real;

begin

  readln(n);

  for i:=1 to n do

    begin

      readln(x[i],y[i]);

      for j:=1 to i-1 do

        begin

          a[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));

          a[j,i]:=a[i,j];

        end;

    end;

  fillchar(v,sizeof(v),#0);

  v[1]:=1;

  for i:=1 to n-1 do

    begin

      min:=maxlongint;

      for j:=1 to n do

        if v[j]=1 then

          for k:=1 to n do

            if v[k]=0 then

              if (a[j,k]<min)and(a[j,k]<>0) then

                begin

                  min:=a[j,k];

                  t:=k;

                end;

      if min<>maxlongint then

        begin

          ans:=ans+min;

          v[t]:=1;

        end;

    end;

  write(ans:0:2);
end.

方法2:(本方法从集合变成广搜(擦不多),就是把每一个点关联起来,每枚举一个点就更新(同化)父节点);

var

n,i,j,k,q,p,t:longint;

tj,min:real;

x,y:array[0..200]of real;

f:array[0..200]of longint;

a:array[0..200,0..200]of real;

begin

    readln(n);

    for i:=1 to n do

    readln(x[i],y[i]);

    for i:=1 to n do

    begin

        for j:=1 to n do

        begin

            a[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));

        end;

    end;

    tj:=0;

    for i:=1 to n do

    f[i]:=i;

    for k:=1 to n-1 do

    begin

        min:=maxlongint;

        for i:=1 to n do

        for j:=1 to n do

        if (f[i]<>f[j])and(a[i,j]<min)and(a[i,j]<>0) then

        begin

            min:=a[i,j];

            p:=j;

            q:=i;

        end;

        tj:=tj+min;

        t:=f[p];

        for i:=1 to n do

        if f[i]=t then f[i]:=f[q];

    end;

    write(tj:0:2);

end.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: