- Kerry 的电缆网络
- 2013-02-28 19:40:26 @
type
star=record
u,v:longint;
w:extended;
end;
var
se:array [1..100000] of longint;
st:array [1..100000] of star;
n,m,i:longint;
s,si,ans:extended;
procedure init;
var
i:longint;
begin
readln(s);
readln(n);
i:=0;
while not eof do
begin
i:=i+2;
readln(st[i-1].u,st[i-1].v,st[i-1].w);
st[i].u:=st[i-1].v;
st[i].v:=st[i-1].u;
st[i].w:=st[i-1].w;
end;
m:=i;
end;
function find(i:longint):longint;
var
x,y:longint;
begin
x:=se[i];
y:=i;
while x>0 do
begin
y:=x;
x:=se[y];
end;
find:=y;
x:=se[i];
y:=i;
while x>0 do
begin
se[y]:=find;
y:=x;
x:=se[y];
end;
end;
procedure union(i,j:longint);
var
x,y:longint;
begin
x:=find(i);
y:=find(j);
if x=y then exit;
if se[x]<se[y] then
begin
se[x]:=se[x]+se[y];
se[y]:=x;
end
else
begin
se[y]:=se[x]+se[y];
se[x]:=y;
end;
end;
procedure qsort(a,b:longint);
var
i,j:longint;
x,mid:star;
begin
i:=a;
j:=b;
mid:=st[(i+j) div 2];
repeat
while st[i].w<mid.w do inc(i);
while st[j].w>mid.w do dec(j);
if not(i>j) then
begin
x:=st[i];
st[i]:=st[j];
st[j]:=x;
inc(i);
dec(j);
end;
until i>j;
if j>a then qsort(a,j);
if i<b then qsort(i,b);
end;
function check(i:longint):boolean;
var
num:longint;
begin
num:=-se[find(i)];
if num=n
then exit(true)
else exit(false);
end;
procedure kruskal;
var
i,j,k:longint;
begin
ans:=0;
i:=1;
while not check(1) do
begin
inc(i);
j:=find(st[i].u);
k:=find(st[i].v);
if j=k then continue;
ans:=ans+st[i].w;
union(j,k);
end;
end;
begin
init;
for i:=1 to n do
se[i]:=-1;
qsort(1,m);
kruskal;
if ans<s
then writeln('Need ',ans:0:2,' miles of cable')
else writeln('Impossible');
end.
为什么runtime error
只能过前两个点。。。。
求教
1 条评论
-
twd2 LV 9 MOD @ 2013-03-01 20:14:15
啊啊啊tab
- 1