• [题解][luogu p1273]有线电视网


    这是一道树形dp......

    f[i][j]表示在第i个节点可有j个观众的最大money数(注意可以为负).

    转移的话一个一个枚举父亲的最大观众数和儿子节点的最大观众数即可,每个节点的最大观众数可以预处理出来.

    最后答案就是f[1][最大的j]>=0,如果全小于0则输出0.

    上代码

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define N 3010
    #define inf 0x7f7f7f7f
    using namespace std;
    int f[N][N],n,cnt,head[N],m,b[N],son[N];
    struct Edge{
        int v,w,nxt;
    }E[N<<1];
    int read()
    {
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
        return x*f;
    }
    void addedge(int u,int v,int w)
    {
        E[++cnt].v=v;
        E[cnt].w=w;
        E[cnt].nxt=head[u];
        head[u]=cnt;
    }
    void dfs1(int u,int fa)//预处理
    {
        if(b[u])son[u]=1,f[u][1]=b[u];//son是每个节点的最大观众数
        for(int i=head[u];i;i=E[i].nxt)
        {
            int v=E[i].v;
            if(v==fa)continue;
            dfs1(v,u);
            son[u]+=son[v];
        }
    }
    void dfs(int u,int fa)
    {
        for(int i=head[u];i;i=E[i].nxt)
        {
            int v=E[i].v;
            if(v==fa)continue;
            dfs(v,u);
            for(int j=son[u];j>=1;--j)//枚举父亲
                for(int k=son[v];k>=1;--k)//枚举儿子
                    f[u][j]=max(f[u][j],f[v][k]+f[u][j-k]-E[i].w);
            for(int j=son[v];j>=1;--j)f[u][j]=max(f[u][j],f[v][j]-E[i].w);
        }
    }
    int main()
    {
        n=read();m=read();
        for(int i=1;i<=n-m;++i)
        {
            int k=read(),a,c;
            for(int j=1;j<=k;++j)
            {
                a=read();c=read();
                addedge(i,a,c);addedge(a,i,c);
            }
        }
        for(int i=n-m+1;i<=n;++i)b[i]=read();
        memset(f,-inf,sizeof f);
        dfs1(1,0);dfs(1,0);
        for(int i=son[1];i>=1;--i)if(f[1][i]>=0){printf("%d
    ",i);return 0;}
        printf("0
    ");
        return 0;
    }


    ~~~~

  • 相关阅读:
    Plug It In
    The King's Walk
    Water Testing 匹克定理
    基尔霍夫矩阵
    nginx 常用的命令
    Nginx window安装
    使用nrm管理 npm 镜像仓库
    window 安装node.js
    变量和数据类型
    同步,异步,阻塞,非阻塞
  • 原文地址:https://www.cnblogs.com/fanyujun/p/9351377.html
Copyright © 2020-2023  润新知