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 二叉苹果树的主要内容,如果未能解决你的问题,请参考以下文章