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 |
这是我的代码,能帮我看看为什么WA吗?Const maxn=10005; Var n,m,u,v,i,j,k,t,ans,ans1:longint; first,size,dep,dis:array[0..maxn] of longint; next,ot,len:array[0..maxn*2] of longint; b,used:array[0..maxn] of boolean; Procedure solve(p,d1,d2:longint); Var w,num,k,v,reans,reans1:longint; wtf:boolean; Procedure dfssize(u:longint); Var v,k:longint; Begin size[u]:=1; b[u]:=true; k:=first[u]; while k<>-1 do begin v:=ot[k]; if not b[v] and not used[v] then begin dfssize(v); size[u]:=size[u]+size[v]; end; k:=next[k]; end; End; Procedure getw(u,n:longint); Var v,k:longint; f:boolean; Begin if wtf then exit; b[u]:=true; k:=first[u]; f:=false; if n-size[u]<=n div 2 then f:=true; while k<>-1 do begin v:=ot[k]; if not b[v] and not used[v] then begin if size[v]>n div 2 then f:=false; getw(v,n); end; k:=next[k]; end; if f then begin w:=u; wtf:=true; end; End; Procedure dfsdepth(u:longint); Var k,v:longint; Begin b[u]:=true; k:=first[u]; while k<>-1 do begin v:=ot[k]; if not b[v] and not used[v] then begin dep[v]:=dep[u]+len[k]; dfsdepth(v); end; k:=next[k]; end; inc(num); dis[num]:=dep[u]; End; Procedure Qs(l,r:longint); Var i,j,x,t:longint; Begin i:=l; j:=r; x:=Dis[(i+j) div 2]; Repeat while dis[i]<x do inc(i); while dis[j]>x do dec(j); if i<=j then begin t:=dis[i]; dis[i]:=dis[j]; dis[j]:=t; inc(i); dec(j); end; Until i>j; if l<j then Qs(l,j); if i<r then Qs(i,r); End; Procedure calc(d1,d2:longint); Var i,j:longint; Begin ans:=0; ans1:=0; i:=1; j:=num; while i<j do if dis[i]+dis[j]<=d1 then begin ans:=ans+j-i; inc(i); end else dec(j); i:=1; j:=num; while i<j do if dis[i]+dis[j]<=d2 then begin ans1:=ans1+j-i; inc(i); end else dec(j); End; Begin fillchar(b,sizeof(b),0); dfssize(p); fillchar(b,sizeof(b),0); wtf:=false; getw(p,size[p]); used[w]:=true; dep[w]:=0; num:=0; fillchar(b,sizeof(b),0); dfsdepth(w); Qs(1,num); calc(d1,d2); reans:=ans; reans1:=ans1; k:=first[w]; while k<>-1 do begin v:=ot[k]; if not used[v] then begin solve(v,d1,d1-2*len[k]); reans:=reans+ans-ans1; end; k:=next[k]; end; ans:=reans; ans1:=reans1; End; Begin readln(n,t); while not ((n=0)and(t=0)) do begin for i:=0 to n do begin first[i]:=-1; used[i]:=false; end; m:=n-1; for i:=1 to m do begin read(u,v); next[i]:=first[u]; first[u]:=i; ot[i]:=v; readln(len[i]); next[i+m]:=first[v]; first[v]:=m+i; ot[m+i]:=u; len[m+i]:=len[i]; end; solve(1,t,t); writeln(ans); readln(n,t); end; End. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator