P2015 二叉苹果树

Posted ukcxrtjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2015 二叉苹果树相关的知识,希望对你有一定的参考价值。

题面:https://www.luogu.org/problemnew/show/P2015

设f[u][i]表示u的子树上保留i条边,至多保留的苹果数目
那么状态转移方程也就显而易见了:
f[u][i]=max(f[u][i],f[u][i?j?1]+f[v][j]+e[i].w)( 1≤i≤min(q,sz[u]),0≤j≤min(sz[v],i?1))
u表示当前节点,v是u的一个子节点,sz[u]表示u的子树上的边数,q就是题目中要求的最多保留边数。

Code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<vector>
using namespace std;
const int N=105;
vector<int>a[N];
int n,q,f[N][N],val[N][N];
bool vis[N];
void dfs(int u)
    if(!vis[u])
        vis[u]=1;
    
    int length=a[u].size();
    for(int i=0;i<length;i++)
        int v=a[u][i];
        if(!vis[v])
            vis[v]=1;
            dfs(v);
            for(int j=q;j>=1;j--)
                for(int k=j-1;k>=0;k--)
                    f[u][j]=max(f[u][j],val[u][v]+f[v][k]+f[u][j-k-1]);
                
            
        
    

int main()
    int u,v,w;
    scanf("%d%d",&n,&q);
    for(int i=1;i<n;i++)
        scanf("%d%d%d",&u,&v,&w);
        val[u][v]=w;
        a[u].push_back(v);
    
    dfs(1);
    printf("%d\n",f[1][q]);
    return 0;

以上是关于P2015 二叉苹果树的主要内容,如果未能解决你的问题,请参考以下文章

P2015 二叉苹果树

P2015 二叉苹果树

P2015 二叉苹果树

P2015 二叉苹果树

洛谷 P2015 二叉苹果树

洛谷P2015二叉苹果树