HDU - 1561(简单树形背包)

来源:互联网 发布:潍坊行知学校邮编 编辑:程序博客网 时间:2024/05/16 10:33
#include <cstdio>#include <cstring>#include <vector>#include <iostream>#include <algorithm>using namespace std;const int inf  = 100000;const int maxn = 205;int n,m,head[maxn],len;struct node{ int to,next;}tree[maxn*2];void init(){  memset(head,-1,sizeof(head));  len = 0;}void add_eadge(int u,int v){  tree[len].to = v;  tree[len].next = head[u];  head[u] = len++;}int d[maxn][maxn],temp[maxn],w[maxn];void dfs(int root,int f){  for(int i=0;i<=m;i++)    d[root][i] = 0;  for(int i=head[root];i!=-1;i=tree[i].next){    if(tree[i].to == f) continue;    int p = tree[i].to;    dfs(p,root);    for(int j=0;j<=m;j++) temp[j]=d[root][j];    for(int j=1;j<=m;j++)        for(int k=1;k<=j;k++)          d[root][j]=max(d[root][j],temp[j-k]+d[p][k-1]+w[p]);  }}int main(){    while(scanf("%d %d",&n,&m)==2){      if(!n&&!m) break;      init();      for(int i=1;i<=n;i++){        int x,y;        scanf("%d %d",&x,&y);        add_eadge(x,i);        add_eadge(i,x);        w[i] = y;      }      w[0] = 0;      dfs(0,-1);      printf("%d\n",d[0][m]);    }    return 0;}

0 0
原创粉丝点击