View Code
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 10010 struct edge{ int to,next; }e[N*10]; int pre[N*10],c[N*10],v[N*10],dp[550][N]; /*void add(int a,int b) { e[cnt].to=b; e[cnt].next=pre[a]; pre[a]=cnt++; }*/ void dfs(int u,int g) { for(int edg=pre[u];edg!=0;edg=e[edg].next) { int v0=e[edg].to; //cout<<v0<<endl; if(pre[v0]) { for(int i=0;i<=g-c[v0];i++) dp[v0][i]=dp[u][i]+v[v0]; dfs(v0,g-c[v0]); for(int i=c[v0];i<=g;i++) if(dp[u][i]<dp[v0][i-c[v0]])dp[u][i]=dp[v0][i-c[v0]]; } else { for(int i=g;i>=c[v0];i--) if(dp[u][i]<dp[u][i-c[v0]]+v[v0])dp[u][i]=dp[u][i-c[v0]]+v[v0]; } } } int main() { int n,g; while(scanf("%d%d",&n,&g)!=EOF) { int cnt=1; memset(pre,0,sizeof(pre)); memset(dp,0,sizeof(dp)); v[0]=c[0]=0; for(int i=1;i<=n;i++) { int f; scanf("%d%d%d",&c[i],&v[i],&f); if(i!=f) { e[cnt].to=i; e[cnt].next=pre[f]; pre[f]=cnt++; } else { e[cnt].to=i; e[cnt].next=pre[0]; pre[0]=cnt++; } } dfs(0,g); //for(int i=0;i<=n;i++,cout<<endl) //for(int j=0;j<=g;j++) //cout<<dp[i][j]<<" "; printf("%d\n",dp[0][g]); } return 0; }