【树形DP】 HDU 1520 Anniversary party

来源:互联网 发布:萤火虫算法 编辑:程序博客网 时间:2024/04/27 18:19

题目链接:  HDU   1520   Anniversary party

分析:  虽然看一去是有向边, 但完全可以用无向边去做!

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=6010;struct node{    int v;    node *next;}tree[maxn<<1],*head[maxn];int n,ptr;bool vis[maxn];int dp[maxn][2],val[maxn];void Init(){    ptr=1;    memset(vis,false,sizeof(vis));    memset(dp,0,sizeof(dp));    memset(head,0,sizeof(head));}void AddEdge(int x,int y){    tree[ptr].v=y;    tree[ptr].next=head[x];    head[x]=&tree[ptr++];}void DFS(int cnt){    vis[cnt]=true;    dp[cnt][1]=val[cnt];    node *p=head[cnt];    while(p!=NULL){        if(vis[p->v]){            p=p->next; continue;        }        DFS(p->v);        dp[cnt][1] += dp[p->v][0];        dp[cnt][0] += max(dp[p->v][1], dp[p->v][0]);        p=p->next;    }}int main(){    while(~scanf("%d",&n)&&n){        Init();        for(int i=1;i<=n;++i)            scanf("%d",val+i);        int a,b;        while(scanf("%d%d",&a,&b)&&a+b){            AddEdge(a,b);            AddEdge(b,a);        }        DFS(1);        printf("%d\n",max(dp[1][0],dp[1][1]));    }    return 0;}