> Description
Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。
> Input
第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。
> Output
输出最大的快乐指数。
> Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
> Sample Output
5
> 解题思路
根据题意,可以弄出一个树状结构:
s[i][0]表示不选序号为i的职员,相反,s[i][1]表示选序号为i的职员(的最大快乐指数)。因为(如图)如果选了序号5,那就一定不能选3和4,就必须得选1、2、6、7;如果没有选5,3和4选不选都无所谓,如果3和4选的话就不能选1、2、6、7了。
如这一幅图(第一个数为选当前数,第二个数为不选)
然后就是领接表:f[i].x存直属上司,f[i].to存这个上司的其中一个职员。f[i].next和h的数组连用,把属于h[i]中的上司i的所有职员连在了一起,看代码理解一下。。。
序号 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
head | 2 | 4 | 6 | |||
f.x | 3 | 3 | 4 | 4 | 5 | 5 |
f.to | 1 | 2 | 6 | 7 | 4 | 3 |
f.next | 0 | 1 | 0 | 3 | 0 | 5 |
> 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct ooo
{
int x,to,next;