POJ2631 树最长路径dfsDP重写
前文:http://www.cnblogs.com/htfy/archive/2013/03/06/2946741.html。
优化内存
Problem: 2631 | User: HTwood |
Memory: 1160K | Time: 32MS |
Language: Pascal | Result: Accepted |
program p2631; TYpe rec=record e,w,next:longint; end; Var a:array[0..30000] of rec; b,f1,f2,f3,d1,d2:array[0..30000] of longint; v,exist:array[0..30000] of boolean; n,ss,ee,ww,i,ans,top,h:longint; Procedure fopen; begin assign(input,'p2631.in'); assign(output,'p2631.out'); reset(input); rewrite(output); end; Procedure fclose; begin close(input); close(output); end; Function max(a,b:longint):longint;inline; begin if a>b then exit(a) else exit(b); end; Procedure Add(ss,ee,ww:longint); begin inc(top); with a[top] do begin e:=ee; w:=ww; next:=b[ss]; end; b[ss]:=top; end; Procedure dfs1(P,fa:longint); var x:rec; g:longint; begin g:=b[p]; //writeln('(',p,',',fa,')'); while g>0 do begin x:=a[g]; g:=x.next; if x.e<>fa then dfs1(x.e,p); if (f1[x.e]+x.w>f1[p]) and (x.e<>fa) then begin d1[p]:=x.e; f1[p]:=f1[x.e]+x.w; end; end; g:=b[p]; while g>0 do begin x:=a[g]; g:=x.next; if (f1[x.e]+x.w>f2[p]) and (x.e<>d1[p]) and (x.e<>fa) then begin d2[p]:=x.e; f2[p]:=f1[x.e]+x.w; end; end; end; Procedure dfs2(P,fa,wf:longint); var g:longint; x:rec; begin if p<>h then if d1[fa]<>p then f3[p]:=max(f1[fa],f3[fa])+wf else f3[p]:=max(f2[fa],f3[fa])+wf; g:=b[p]; while g>0 do begin x:=a[g]; g:=x.next; if x.e<>fa then dfs2(x.e,p,x.w); end; end; begin n:=0;top:=0;fillchar(exist,sizeof(exist),false); while not eof do begin readln(ss,ee,ww); exist[ss]:=true; exist[ee]:=true; n:=max(n,ss); n:=max(n,ee); Add(ss,ee,ww); Add(ee,ss,ww); end; fillchar(v,sizeof(v),false); h:=1; dfs1(h,0); dfs2(h,0,0); for i:=1 to n do ans:=max(ans,max(f1[i],max(f2[i],f3[i]))); writeln(ans); end.