| ||||||||||
| 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 | |||||||||
我的Prim怎么会超时?const
nv=100;
type
r=record
vex1,vex2:1..nv;
w:longint;
end;
set1=set of 1..nv;
settype=array[1..nv] of set1;
var
n,l,q,a,b:integer;
stev:settype;
ans:longint;
m:array[1..nv*nv] of r;
procedure init;
var
i,j:integer;
begin
readln(n);
l:=0;
ans:=0;
for i:=1 to n do
begin
for j:=1 to n do
begin
inc(l);
m[l].vex1:=i;
m[l].vex2:=j;
read(m[l].w);
end;
readln;
end;
readln(q);
for i:=1 to q do
begin
readln(a,b);
m[(a-1)*n+b].w:=0;
end;
end;
procedure sort;
var
i,j:integer;
k:r;
begin
for i:=1 to l-1 do
for j:=i+1 to l do
if m[i].w>m[j].w then
begin
k:=m[i];
m[i]:=m[j];
m[j]:=k;
end;
end;
function find(var setv:settype;vex:integer):integer;
var
i:integer;
begin
i:=1;
while (i<=nv)and(not(vex in setv[i])) do inc(i);
if i<=nv then find:=i
else find:=0;
end;
procedure kruskal(var setv:settype);
var
i,n,u,v,u1,v1,k:integer;
begin
k:=1;
n:=nv;
for i:=1 to nv do setv[i]:=[i];
while (l>1)and(k<=l) do
begin
u:=m[k].vex1;
v:=m[k].vex2;
u1:=find(stev,u);
v1:=find(stev,v);
if u1<>v1 then
begin
inc(ans,m[k].w);
stev[u1]:=stev[u1]+stev[v1];
stev[v1]:=[];
dec(l);
end;
inc(k);
end;
end;
begin
while not eof do
begin
init;
sort;
kruskal(stev);
writeln(ans);
end;
end.
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator