標籤:style blog color io for ar art div
如果選了節點u,則不能選他的父節點和子節點,每個點有一個權值,求最大權值。
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 6100#define maxm 15000struct Node{ int u,v,next;}e[maxm];int head[maxn],cnt,val[maxn],dp[maxn][2];void add(int u,int v){ e[cnt].u=u; e[cnt].v=v; e[cnt].next=head[u]; head[u]=cnt++; e[cnt].u=v; e[cnt].v=u; e[cnt].next=head[v]; head[v]=cnt++;}void dfs(int u,int fa){ int i,v; dp[u][1]=val[u]; dp[u][0]=0; for(i=head[u];i!=-1;i=e[i].next) { v=e[i].v; if(v==fa) continue; dfs(v,u); dp[u][1]+=dp[v][0]; dp[u][0]+=max(dp[v][1],dp[v][0]); }}int main(){ int n,u,v; while(scanf("%d",&n)!=EOF) { int i; memset(head,-1,sizeof(head)); cnt=0; for(i=1;i<=n;i++) scanf("%d",&val[i]); while(1) { scanf("%d%d",&u,&v); if(u==0&&v==0)break; add(u,v); } dfs(1,-1); int ans=-10000; printf("%d\n",max(dp[1][0],dp[1][1])); } return 0;}