【hdu 1520】


#include<iostream>
#include<stdio.h>
#include<vector>
#include<cstring>
using namespace std;


const int maxn=6005;
int value[maxn];
 struct node 
 {
  int fa,son,next;
 }e[maxn];
 int nume=0;
 int head[maxn];
 int n;
 void add(int fa,int son)
 {
  e[++nume].fa=fa;
  e[nume].son=son;
  e[nume].next=head[fa];
  head[fa]=nume;
 }
 
 bool son[maxn];
 
 int dp[maxn][2];
 
 
 void dfs(int root)
 {
  int i=head[root];
  dp[root][1]=value[root];
  dp[root][0]=0;
  if(i==0)
  return ;
while(i!=0)
{
dfs(e[i].son);
dp[root][1]+=dp[e[i].son][0];
dp[root][0]+=max(dp[e[i].son][0],dp[e[i].son][1]);
i=e[i].next;
}


 
 }
 int main()
 {
while(cin>>n)
{

  for(int i=1;i<=n;i++)
  {
  cin>>value[i];
}
 
memset(head,0,sizeof(head));
memset(son,false,sizeof(son));
int fa,sson;
while(cin>>sson>>fa)
{
add(fa,sson);
son[sson]=1;
}
int a=1;
while(son[a])
a++;
 
dfs(a);
cout<<max(dp[a][0],dp[a][1]);
 
}
 
  return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值