您的位置:首页 > 其它

1380 没有上司的舞会

2014-08-18 20:09 225 查看


题目描述 Description

Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。


输入描述 Input Description

第一行一个整数N。(1<=N<=6000)

接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)

接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。

最后一行输入0,0。


输出描述 Output Description

输出最大的快乐指数。


样例输入 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

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int n,w[6001],ne=0;//ne为总边数
bool in[6001];//用来寻找根节点
int f[6001][2];
int hd[6001];
struct data{
	int v,next;
}e[6001];
void insert(int v,int u)//插入一条边
{
	ne++;
	e[ne].v=v;
	e[ne].next=hd[u];
	hd[u]=ne;
}
void dp(int u)
{
	f[u][1]=w[u];//1表示取,0表示不取 
	f[u][0]=0;
	for(int p=hd[u];p!=0;p=e[p].next)
	{
		int v=e[p].v;
		dp(v);
		f[u][1]+=f[v][0];
		f[u][0]=f[u][0]+max(f[v][1],f[v][0]);//转移方程 
	}
}
int main()
{
	scanf("%d",&n);
	int l,k;
	for(int i=1;i<=n;i++)
	   scanf("%d",&w[i]);
    while(scanf("%d%d",&l,&k)!=EOF)
    {
    	if(l==0&&k==0)break;
    	in[l]=1;
    	insert(l,k);
    }
    for(int i=1;i<=n;i++)
       if(!in[i])
       {
       	   dp(i);
       	   printf("%d\n",max(f[i][0],f[i][1]));
       	   break;
       }
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: