您的位置:首页 > 其它

POJ 2560Freckles(并查集)

2016-12-15 17:41 411 查看

题意:

找出一条最短路,额…….n<100;

思路:

并查集最短路搞一波,然后就没了….

时间复杂度

O(**

type
arr=record
x,y:longint;
w:real;
end;
const
maxn=100;
var
a:array [0..maxn*maxn] of arr;
f:array [0..maxn*maxn] of longint;
x,y:array [0..maxn*maxn] of real;
i,j,n,m,p:longint;
ans:real;

procedure qsort(l,r:longint);
var
i,j:longint;
mid:real;
begin
i:=l; j:=r;
mid:=a[(l+r) div 2].w;
while i<j do
begin
while a[i].w<mid do inc(i);
while a[j].w>mid 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;
end;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;

function father(x:longint):longint;
var
i,j:longint;
begin
if x<>f[x] then father:=father(f[x])
else father:=x;
f[x]:=father;

end;

begin
readln(n);
for i:=1 to n do
readln(x[i],y[i]);
for i:=1 to n do
for j:=1 to n do
begin
inc(p);
a[p].w:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
a[p].x:=i;
a[p].y:=j;
end;
qsort(1,p);
for i:=1 to p do
f[i]:=i;
for i:=1 to p do
if f[father(a[i].x)]<>f[father(a[i].y)] then
begin
f[father(a[i].x)]:=f[father(a[i].y)];
ans:=ans+a[i].w;
end;
writeln(ans:0:2);

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