hdu1520

来源:互联网 发布:淘宝网店软文特点 编辑:程序博客网 时间:2024/06/05 08:15
//简单的树形dp#include<iostream>#include<cstdio>#include<cstring>using namespace std;int v[6010];bool parent[6010];int head[6010];int dp[6010][2];int cnt;struct edge{    int to,next;}e[6010];void dfs(int x){    dp[x][1]=v[x];    dp[x][0]=0;    for(int i=head[x];i!=-1;i=e[i].next)    {        int j=e[i].to;        dfs(j);        dp[x][1]+=dp[j][0];        dp[x][0]+=max(dp[j][0],dp[j][1]);    }}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {    for(int i=1;i<=n;i++)scanf("%d",&v[i]);    memset(parent,0,sizeof(parent));    memset(head,-1,sizeof(head));    int a,b;    cnt=0;    while(scanf("%d%d",&a,&b)&&(a+b))    {        e[cnt].to=a;        e[cnt].next=head[b];        head[b]=cnt++;        parent[a]=1;    }    int root;    for(int i=1;i<=n;i++)    {        if(!parent[i]){root=i;break;}    }    dfs(root);    printf("%d\n",max(dp[root][0],dp[root][1]));    }    return 0;}


0 0
原创粉丝点击