您的位置:首页 > 其它

POJ2631 树最长路径dfsDP重写

2013-03-20 19:50 190 查看
前文:http://www.cnblogs.com/htfy/archive/2013/03/06/2946741.html。

优化内存

Problem: 2631User: HTwood
Memory: 1160KTime: 32MS
Language: PascalResult: 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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: