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