无线通讯网 (Standard IO)

Description

国防部计划用无线网络连接若干个边防哨所。2种不同的通讯技术用来搭建无线网络:每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。

任意两个配备了一条卫星电话线路的哨所均可以通话,无论它们相距多远。而只通过无线电收发器通话的哨所之间的距离不能超过D,这是受收发器的功率限制。收发器的功率越高,通话距离D会更远,但同时价格也更贵。

收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个D。

你的任务是确定收发器必须的最小通话距离D,使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。

Input

第1行:2个整数S(1 <= S <= 100)和P(S < P <= 500),S表示可安装的卫星电话的线路数,P表示边防哨所的数量。

接下来P行,每行描述一个哨所的平面坐标(x,y),以km为单位,整数,0<=x,y<=10,000

Output

第1行:1个实数D,表示无线电收发器的最小传输距离。精确到小数点后2位。

题解
最小生成树模板。(注意数组范围)

代码

type
  arr=record
        x,y:longint;
        w:real;
      end;
var
  n,m,nm:longint;
  f:array [0..5001] of longint;
  a:array [0..500001] of arr;
function find(x:longint):longint;
begin
  if (f[x]=x) then exit(x);
  f[x]:=find(f[x]);
  exit(f[x]);
end;

procedure qsort(l,r:longint);
var
  i,j:longint;
  m:real;
begin
  i:=l; j:=r;
  m:=a[(l+r) div 2].w;
  repeat
    while a[i].wdo inc(i);
    while a[j].w>m do dec(j);
    if i<=j then
      begin
        a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0];
        inc(i); dec(j);
      end;
  until i>j;
  if lthen qsort(l,j);
  if ithen qsort(i,r);
end;

procedure init;
var
  i,j:longint;
  x,y:array [0..5001] of longint;
begin
  readln(n,m);
  for i:=1 to m do
    readln(x[i],y[i]);
  nm:=0;
  for i:=1 to m do
    for j:=1 to m do
      if i<>j then
        begin
          inc(nm);
          a[nm].x:=i; a[nm].y:=j;
          a[nm].w:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
        end;
end;

procedure main;
var
  i,j,xx,yy:longint;
begin
  for i:=1 to m do
    f[i]:=i;
  i:=0; j:=0;
  while ido
    begin
      inc(j);
      xx:=find(a[j].x);
      yy:=find(a[j].y);
      if xx<>yy then
        begin
          inc(i);
          f[xx]:=yy;
        end;
    end;
  write(a[j].w:0:2);
end;

begin
  init;
  qsort(1,nm);
  main;
end.

你可能感兴趣的:(无线通讯网 (Standard IO))