| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
kruskal变形程序如下:
program frogger;
var o,k,y,i,j,s,x1,x2,n,g1,g2,i2,j2:integer;
x,x3:real;bb,b1:boolean;
a:array[0..40000] of real;
b,q:array[0..40000,1..2] of integer;
p:array[1..40000] of integer;
procedure qsort(l,r:integer);
begin
i:=l;
j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]<x do inc(i);
while a[j]>x do dec(j);
if i<=j then
begin
x3:=a[i];
a[i]:=a[j];
a[j]:=x3;
y:=b[i,1];
b[i,1]:=b[j,1];
b[j,1]:=y;
y:=b[i,2];
b[i,2]:=b[j,2];
b[j,2]:=y;
inc(i);
dec(j);
end;
until i>j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
function find(x:integer):integer;
begin
s:=x;
while p[s]>=0 do s:=p[s];
while s<>x do
begin
y:=p[x];
p[x]:=s;
x:=y;
end;
find:=s;
end;
procedure union(r1,r2:integer);
begin
x1:=find(r1);
x2:=find(r2);
y:=p[x1]+p[x2];
if p[x1]>p[x2] then
begin
p[x1]:=x2;
p[x2]:=y;
end
else
begin
p[x2]:=x1;
p[x1]:=y;
end;
end;
begin
b1:=true; o:=0;
while b1 do
begin
readln(n); if n=0 then break;o:=o+1;
fillchar(p,sizeof(p),0);
for i:=1 to n do p[i]:=-1;
for i:=1 to n do readln(q[i,1],q[i,2]);
k:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
if i<> j then
begin
k:=k+1;
a[k]:=sqrt(sqr(abs(q[i,1]-q[j,1]))+sqr(abs(q[i,2]-q[j,2])));
b[k,1]:=i;
b[k,2]:=j;
end;
qsort(1,k);
bb:=true;
n:=1;
while bb do
begin
i2:=b[n,1];
j2:=b[n,2];
g1:=find(i2);
g2:=find(j2);
if g1<>g2 then
begin
n:=n+1;
union(i2,j2);
g1:=find(1);
g2:=find(2);
if g1=g2 then
begin
bb:=false;
write('Scenario #');writeln(o);
writeln('Frog Distance = ',a[n-1]:0:3);
writeln;
end;
end
else n:=n+1;
end;
readln;
end;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator