讨论 / 树形动规……想麻烦了
神之水灵 2013-07-06 03:56:00
点我顶贴 收藏 删除
program ex;

type alice=record

x,y,next:longint;

end;

var n,i,j,aa,ab,ac,min,tot,sum:longint;

a,first,up,down:array[1..10000]of longint;

bian:array[1..100000]of alice;

procedure connect(x,y:longint);

begin

inc(tot);

bian[tot].x:=x;

bian[tot].y:=y;

bian[tot].next:=first[x];

first[x]:=tot;

end;

procedure dfs1(x,fa:longint);

var k,y:longint;

begin

k:=first[x];

while k<>0 do

begin

y:=bian[k].y;

if y<>fa then

begin

dfs1(y,x);

inc(a[x],a[y]);

inc(down[x],down[y]);

inc(down[x],a[y]);

end;

k:=bian[k].next;

end;

end;

procedure dfs2(x,fa:longint);

var y,k:longint;

begin

k:=first[x];

while k<>0 do

begin

y:=bian[k].y;

if y<>fa then

begin

up[y]:=up[x]+down[x]-down[y]-a[y]+(sum-a[y]);

dfs2(y,x);

end;

k:=bian[k].next;

end;

end;

begin

assign(input,'ex.in');

assign(output,'ex.out');

reset(input);

rewrite(output);

readln(n);

sum:=0;

for i:=1 to n do

begin

readln(aa,ab,ac);

a[i]:=aa;

inc(sum,a[i]);

if ab<>0 then

begin

connect(i,ab);

connect(ab,i);

end;

if ac<>0 then

begin

connect(i,ac);

connect(ac,i);

end;

end;

dfs1(1,0);

dfs2(1,0);

min:=maxlongint;

for i:=1 to n do

if up[i]+down[i]<min then min:=up[i]+down[i];

writeln(min);

close(input);

close(output);

end.

用树形动规做的……

查看更多回复
提交回复