树形dp。原来这样交替着dp就可以。。。。。。
好像dfs只能传一个参不然爆栈?
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 200500 #define maxe 400500 #define inf 0x7f7f7f7f7f7f7f7fLL using namespace std; int n,x,g[maxv],nume=0,a[maxv],fath[maxv]; long long dp[maxv][2]; struct edge { int v,nxt; }e[maxe]; void addedge(int u,int v) { e[++nume].v=v; e[nume].nxt=g[u]; g[u]=nume; } void dfs(int x) { dp[x][0]=0;dp[x][1]=-inf; for (int i=g[x];i;i=e[i].nxt) { int v=e[i].v; if (v==fath[x]) continue; fath[v]=x;dfs(v); long long t0=dp[x][0],t1=dp[x][1]; dp[x][0]=max(t0+dp[v][0],t1+dp[v][1]); dp[x][1]=max(t0+dp[v][1],t1+dp[v][0]); } dp[x][1]=max(dp[x][0]+a[x],dp[x][1]); } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d",&x,&a[i]); if (i!=1) {addedge(x,i);addedge(i,x);} } dfs(1); printf("%lld\n",dp[1][1]); return 0; }