huangriq

导航

HDU 3593(The most powerful force)

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;
}

 

posted on 2012-04-14 15:12  huangriq  阅读(224)  评论(0编辑  收藏  举报