#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#define maxn 302
#define inf 10000007
using namespace std;
struct data{
int x,y,z;
};
data lin[maxn*2];
int n,d[maxn],f[maxn][maxn],q,tot[maxn],nxt[maxn*2],fst[maxn],cnt=0;
void add(int xx,int yy,int ww){
lin[++cnt].x=xx,lin[cnt].y=yy,lin[cnt].z=ww,nxt[cnt]=fst[xx],fst[xx]=cnt;
lin[++cnt].x=yy,lin[cnt].y=xx,lin[cnt].z=ww,nxt[cnt]=fst[yy],fst[yy]=cnt;
}
int doit(int p,int t,int da){
if(f[p][t]>=0){
return f[p][t];
}
int j=fst[p],l=0,r=0;
for(int j=fst[p];j;j=nxt[j]){
if(lin[j].y==da)continue;
if(!l)l=lin[j].y;
else r=lin[j].y;
}
for(int i=0;i<t;++i){
if(tot[l]<i || (tot[r]<t-1-i))continue;
f[p][t]=max(f[p][t],doit(l,i,p)+doit(r,t-1-i,p));
}
f[p][t]+=d[p];
return (f[p][t]);
}
int findtot(int p,int da){
tot[p]=1;
for(int i=fst[p];i;i=nxt[i]){
if(lin[i].y==da)continue;
d[lin[i].y]=lin[i].z;
f[lin[i].y][1]=lin[i].z;
tot[p]+=findtot(lin[i].y,p);
}
return tot[p];
}
int main(){
int fa,sn,w;
scanf("%d%d",&n,&q);++q;
memset(f,128,sizeof(f));
for(int i=2;i<=n;++i){
scanf("%d%d%d",&fa,&sn,&w);
add(fa,sn,w);
f[i][0]=0;
}
d[1]=0;
tot[1]=findtot(1,1);
doit(1,q,1);
printf("%d\n",f[1][q]);
}
二叉苹果树(树形D)
最新推荐文章于 2024-04-24 21:42:54 发布