hdu 1011 Starship Troopers(树形动态规划)

来源:互联网 发布:小米生活和淘宝的关系 编辑:程序博客网 时间:2024/06/10 05:21
//hdu 1011 Starship Troopers(树形动态规划)#include<iostream>#include<cstdio>#include<string.h>#include<vector>using namespace std;const int N=110;struct node{    int bugs;    int brain;}no[N];vector<int> nos[N];int n,m;int dp[N][N];int visit[N];int Max(int a,int b){    return a>b?a:b;}void dfs(int root){    visit[root]=1;    int num=(no[root].bugs+19)/20;    for(int i=num;i<=m;i++)    {        dp[root][i]=no[root].brain;    }    for(int i=0;i<nos[root].size();i++)    {        int v=nos[root][i];        if(visit[v]==1) continue;        dfs(v);        for(int j=m;j>=num;j--)        {            for(int k=1;j+k<=m;k++)            {                if(dp[v][k])                  dp[root][j+k]=Max(dp[root][j+k],dp[root][j]+dp[v][k]);            }        }    }}int main(){    while(scanf("%d%d",&n,&m)==2)    {        if(n==-1&&m==-1) break;        memset(dp,0, sizeof(dp));        memset(visit,0,sizeof(visit));        for(int i=0;i<N;i++)        {            nos[i].clear();        }        for(int i=1;i<=n;i++)        {            scanf("%d%d",&no[i].bugs,&no[i].brain);        }        int a,b;        for(int i=1;i<=n-1;i++)        {            scanf("%d%d",&a,&b);            nos[a].push_back(b);            nos[b].push_back(a);        }       dfs(1);       if(m==0)       {           printf("0\n");//少了这个语句结果wa了       }       else       {           printf("%d\n",dp[1][m]);       }    }    return 0;}

0 0
原创粉丝点击