如果选了节点u,则不能选他的父节点和子节点,每个点有一个权值,求最大权值。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define maxn 6100 #define maxm 15000 struct 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 ",max(dp[1][0],dp[1][1])); } return 0; }