var n,m,i,j,x,y,lenb,t1,t2:longint;
a:array[1..1000,1..2]of extended;
b:array[0..1600000,1..2]of longint;
fb:array[0..1600000]of extended;
c:array[1..1000]of longint;
ans:extended;
function father(x:longint):longint;
begin
if c[x]=x then exit(x) else exit(father(c[x]));
end;
procedure kuaipai(l,r:longint);
var i,j:longint;
mid:extended;
begin
i:=l;j:=r;
mid:=fb[(l+r)div 2];
repeat
while fb[i]<mid do inc(i);
while fb[j]>mid do dec(j);
if i<=j then
begin
b[0]:=b[i];
b[i]:=b[j];
b[j]:=b[0];
fb[0]:=fb[i];
fb[i]:=fb[j];
fb[j]:=fb[0];
inc(i);
dec(j);
end;
until i>j;
if l<j then kuaipai(l,j);
if i<r then kuaipai(i,r)
end;
begin
readln(n,m);
for i:=1 to n do
begin
readln(x,y);
a[i,1]:=x;
a[i,2]:=y;
end;
for i:=1 to m do
begin
readln(x,y);
inc(lenb);
b[lenb,1]:=x;
b[lenb,2]:=y;
fb[lenb]:=0;
end;
for i:=1 to n do
for j:=1 to n do
begin
if i=j then continue;
inc(lenb);
b[lenb,1]:=i;
b[lenb,2]:=j;
fb[lenb]:=sqrt((a[i,1]-a[j,1])*(a[i,1]-a[j,1])+(a[i,2]-a[j,2])*(a[i,2]-a[j,2]));
end;
kuaipai(1,lenb);
for i:=1 to lenb do c[b[i,1]]:=b[i,1];
for i:=1 to lenb do
begin
c[b[i,1]]:=father(b[i,1]);
c[b[i,2]]:=father(b[i,2]);
if c[b[i,1]]<>c[b[i,2]] then
begin
c[c[b[i,2]]]:=c[b[i,1]];
ans:=ans+fb[i];
end;
end;
writeln(ans:0:2);
end.
Usaco2009 gold 修建道路
題解:
很明顯是最小生成樹,,,,,,,
參考程序:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.