问题描述: | yep喜欢和它所遇见的所有女性成为朋友,因此它有很多朋友。依照亲密程度,yep给它的朋 友划定了等级,等级数越小,亲密程度越大。例如,”某女“为1级,”非常亲密”为2级,等 等。某女只有一个,其它等级的朋友可以有多个。由于yep强大的个人实力,每个等级 i(i>1)的朋友会嫉妒一个等级为i-1的朋友。现在yep想邀请它的所有朋友开个聚会讨论人 生追求与理想。为了保持社会和谐,yep希望参加聚会的朋友间没有矛盾;为了将来的人 生,它还希望参加聚会的朋友的美丽度之和最大。为了满足它小小的追求,yep请你帮它计 算,参加聚会的朋友的美丽度之和最大为多少。 | |
数据输入: | 第1行为一个整数N,为yep的朋友数量。 第2行到第N+1行每行二个整数P,Q。第i行的数分别表示编号为i-1的朋友的美丽度和她所 嫉妒的朋友的编号(Q=-1表示此行描述的是某女)。 | |
结果输出: | 一个数ANS,为参加聚会的朋友的美丽度之和的最大值。 | |
样例: | 6 30 -1 15 1 2 1 17 2 23 2 7 3 | 77 |
核心思想: | Dp,上司选下属不选,上司不选下属爱选不选,也可以成为回溯哈。 |
type
edge=record
d,y,next:longint;
end;
var
a:array[0..200001]of edge;
f,first:array[0..200001]of longint;
n,i,tot,x,y,d:longint;
procedure ad_edge(x,y,d:longint);
begin
inc(tot);
a[tot].y:=y;
a[tot].d:=d;
a[tot].next:=first[x];
first[x]:=tot;
end;
function dfs(x:longint):longint;
var
t,k,sum1,sum2:longint;
begin
iff[x]>0 then exit(f[x]);
t:=first[x];
sum1:=a[x].d;
sum2:=0;
while t>0 do
begin
k:=first[t];
while k>0 do
begin
inc(sum1,dfs(k));
k:=a[k].next;
end;
inc(sum2,dfs(t));
t:=a[t].next;
end;
ifsum1>sum2 then f[x]:=sum1 else f[x]:=sum2;
exit(f[x]);
end;
begin
assign(input,'yepparty.in');reset(input);
assign(output,'yepparty.out');rewrite(output);
tot:=0;
readln(n);
fori:=1 to n do
begin
readln(d,y);
ad_edge(y,i,d);
end;
writeln(dfs(1));
close(input);close(output);
end.
题目来源:NDK 1367