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 |
!!!强!!!烈!!!建!!!议!!!对于PASCAL空间限制太紧了。 我写的用堆优化的。。在tju AC了,内存17000k。。。 我真的不知道怎么减少内存了! 强烈建议,减小内存限制! 附:本人可怜的代码: program Highways; const maxn=750; type link=^node; node=record d:integer; w:double; next:link; end; heaptype=record lowcost:double; pointer:integer; end; postype=record x,y:double; end; var vertex:array[1..maxn]of link; h:array[1..maxn]of heaptype; a:array[1..maxn]of integer; chosen:array[1..maxn]of boolean; closet:array[1..maxn]of integer; loc:array[1..maxn]of postype; n,m,num:integer; procedure go_up(s,t:integer); var ti,tj:integer; x:heaptype; begin if s>=t then exit; tj:=t; ti:=tj shr 1; x:=h[tj]; while ti>=s do if x.lowcost<h[ti].lowcost then begin a[h[ti].pointer]:=tj; h[tj]:=h[ti]; tj:=ti; ti:=tj shr 1; end else break; h[tj]:=x; a[x.pointer]:=tj; end; procedure go_down(s,t:integer); var ti,tj:integer; x:heaptype; begin if s>=t then exit; ti:=s; tj:=ti shl 1; x:=h[ti]; while tj<=t do begin if (tj<t) and (h[tj+1].lowcost<h[tj].lowcost) then inc(tj); if x.lowcost>h[tj].lowcost then begin a[h[tj].pointer]:=ti; h[ti]:=h[tj]; ti:=tj; tj:=ti shl 1; end else break; end; h[ti]:=x; a[x.pointer]:=ti; end; procedure enter; var i,j,x,y:integer; t:double; p:link; begin fillchar(vertex,sizeof(vertex),0); fillchar(chosen,sizeof(chosen),0); readln(n); for i:=1 to n do readln(loc[i].x,loc[i].y); for i:=1 to n-1 do for j:=i+1 to n do begin t:=sqrt(sqr(loc[i].x-loc[j].x)+sqr(loc[i].y-loc[j].y)); new(p); p^.d:=j; p^.w:=t; p^.next:=vertex[i]; vertex[i]:=p; new(p); p^.d:=i; p^.w:=t; p^.next:=vertex[j]; vertex[j]:=p; end; readln(m); for i:=1 to m do begin readln(x,y); new(p); p^.d:=y; p^.w:=0; p^.next:=vertex[x]; vertex[x]:=p; new(p); p^.d:=x; p^.w:=0; p^.next:=vertex[y]; vertex[y]:=p; end; chosen[1]:=true; num:=n-1; for i:=1 to n-1 do begin h[i].lowcost:=9999999999; h[i].pointer:=i+1; a[i+1]:=i; closet[i+1]:=1; end; p:=vertex[1]; while p<>nil do begin if p^.w<h[a[p^.d]].lowcost then begin h[a[p^.d]].lowcost:=p^.w; go_up(1,a[p^.d]); end; p:=p^.next; end; end; procedure solve; var i,k:integer; p:link; begin for i:=1 to n-1 do begin k:=h[1].pointer; p:=vertex[k]; chosen[k]:=true; if h[1].lowcost<>0 then writeln(k,' ',closet[k]); a[h[num].pointer]:=1; h[1]:=h[num]; dec(num); go_down(1,num); while p<>nil do begin if not chosen[p^.d] and (p^.w<h[a[p^.d]].lowcost) then begin if p^.d=3 then k:=k; closet[p^.d]:=k; h[a[p^.d]].lowcost:=p^.w; go_up(1,a[p^.d]); end; p:=p^.next; end; end; end; begin enter; solve; end. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator