dp[i][0]表示i不参加
dp[i][1]表示i参加
简单的树形dp
#include<stdio.h> #include<string.h> #define N 6100 #define inf 0x3fffffff int dp[N][2],vis[N],head[N],num,n,lo[N],mm; struct edge { int st,ed,next; }E[N*2]; void addedge(int x,int y) { E[num].st=x; E[num].ed=y; E[num].next=head[x]; head[x]=num++; } int max(int a,int b) { if(a>b)return a; return b; } void dfs(int u) { int v,i; dp[u][0]=0; dp[u][1]=lo[u]; vis[u]=1; for(i=head[u];i!=-1;i=E[i].next) { v=E[i].ed; if(vis[v]==1)continue; dfs(v); dp[u][0]+=max(dp[v][1],dp[v][0]); dp[u][1]+=dp[v][0]; } } int main() { int i,x,y; while(scanf("%d",&n)!=-1) { for(i=1;i<=n;i++) scanf("%d",&lo[i]); memset(head,-1,sizeof(head)); num=0; while(scanf("%d%d",&x,&y),x||y) { addedge(x,y); addedge(y,x); } memset(vis,0,sizeof(vis)); dfs(1); printf("%d ",dp[1][0]>dp[1][1]?dp[1][0]:dp[1][1]); } return 0; }