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.