HDU 1520

来源:互联网 发布:在线起名字软件 编辑:程序博客网 时间:2024/06/05 21:15
#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<math.h>#include<string.h>using namespace std;const int MAXN=20000+5;struct node{    int v;    int next;}tree[MAXN];int vis[MAXN],head[MAXN],dp[MAXN][2];int ptr,n;void init(){    ptr=0;    memset(dp,0,sizeof(dp));    memset(vis,0,sizeof(vis));    memset(head,-1,sizeof(head));}void addedge(int x,int y)//y is x's son{    tree[ptr]=(node){y,head[x]};    head[x]=ptr++;}void dfs(int cur){    vis[cur]=1;    for(int i=head[cur];i!=-1;i=tree[i].next)    {        int v=tree[i].v;        if(!vis[v])        {            dfs(v);            dp[cur][1]+=dp[v][0];            dp[cur][0]+=max(dp[v][1],dp[v][0]);        }    }}int main(){    int n,a,b;    while(scanf("%d",&n)!=EOF)    {        init();        for(int i=1;i<=n;i++) scanf("%d",&dp[i][1]);        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;}
0 0
原创粉丝点击