POJ 1155-TELE(树形背包)

题意:电视台发送信号给很多用户,每个用户(叶子节点)有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号。

分析:问题与以i为根节点的子树所包含的叶子数

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<11
#define All 1,N,1
#define read freopen("in.txt", "r", stdin)
const ll  INFll = 0x3f3f3f3f3f3f3f3fLL;
const int INF= 0x7ffffff;
const int mod =  1000000007;
struct tree{
    int  e,v,next;
}t[6010];
int dp[3100][3100],num[3100],tmp[3100],head[3100],len;
int n,m;
void add(int a,int b,int v){
    t[len].e=b;
    t[len].v=v;
    t[len].next=head[a];
    head[a]=len++;
}
void dfs(int root){
    for(int i=head[root];i!=-1;i=t[i].next){
        int son=t[i].e;
        dfs(son);
       for(int j=0;j<=num[root];++j)//把由前几个子树所得存起来,避免后面计算相互影响
            tmp[j]=dp[root][j];
        for(int j=0;j<=num[root];++j)
        for(int k=0;k<=num[son];++k)
        {
            dp[root][j+k]=max(dp[root][j+k],tmp[j]+dp[son][k]-t[i].v);
        }
        num[root]+=num[son];
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m)){
        int k,a,b;
        len=0;
        memset(head,-1,sizeof(head));
        for(int i=1;i<=n-m;++i)
        {
            scanf("%d",&k);
            num[i]=0;
            while(k--){
                scanf("%d%d",&a,&b);
                add(i,a,b);
            }
        }
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j)
            dp[i][j]=-INF;
        for(int i=n-m+1;i<=n;++i){
            num[i]=1;
           scanf("%d",&dp[i][1]);
        }
        dfs(1);
        for(int i=m;i>=0;--i)
        if(dp[1][i]>=0){
            printf("%d\n",i);
            break;
        }
    }
return 0;
}

  

有关,则dp[i][j]表示以i为根的子树,包含j个用户所剩余的钱数。

posted on 2015-08-03 09:05  积跬步、至千里  阅读(253)  评论(0编辑  收藏  举报

导航