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.

浙公网安备 33010602011771号