Anniversary party POJ

来源:互联网 发布:淘宝人群标签 编辑:程序博客网 时间:2024/05/17 07:27

点击打开链接

第一道树形dp题目 虽然a了 但理解还是不到位

#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;struct node{    int v;    int next;};node edge[12010];int dp[6010][2];int first[6010],degree[6010],book[6010];int n,m,num,root;void addedge(int u,int v);void unite(int u,int v);int getf(int p);void dfs(int cur);int main(){    int i,j,u,v;    while(scanf("%d",&n)!=EOF)    {        if(n==0)        {            scanf("%d",&n);            break;        }        m=n-1;        memset(dp,0,sizeof(dp));        for(i=1;i<=n;i++)        {            scanf("%d",&dp[i][1]);        }        memset(first,-1,sizeof(first));        memset(degree,0,sizeof(degree));        num=0;        for(i=1;i<=m;i++)        {            scanf("%d%d",&u,&v);            degree[u]++;            addedge(u,v);            addedge(v,u);        }        for(i=1;i<=n;i++)        {            if(degree[i]==0)            {                root=i;                break;            }        }        memset(book,0,sizeof(book));        book[root]=1;        dfs(root);        printf("%d\n",max(dp[root][0],dp[root][1]));    }    return 0;}void addedge(int u,int v){    edge[num].v=v;    edge[num].next=first[u];    first[u]=num++;    return;}void dfs(int cur){    int i,v;    for(i=first[cur];i!=-1;i=edge[i].next)    {        v=edge[i].v;        if(book[v]==0)        {            book[v]=1;            dfs(v);            dp[cur][0]+=max(dp[v][0],dp[v][1]);            dp[cur][1]+=dp[v][0];        }    }    return;}

原创粉丝点击