| 比赛 | 动规 | 评测结果 | AAAAAAAAAAAAA | 
    | 题目名称 | 二叉苹果树 | 最终得分 | 100 | 
    | 用户昵称 | Menamovic | 运行时间 | 0.013 s | 
    | 代码语言 | C++ | 内存使用 | 0.40 MiB | 
    | 提交时间 | 2017-06-18 21:56:13 | 
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int e=105;
int tree[e][3]={0};
int f[e][e]={0},ma[e][e]={0},num[e]={0};
int n,q;
void first()
{
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			ma[i][j]=-1;
			ma[j][i]=-1;
		}
	}
}
void maketree(int v);
void build(int x,int y,int lor)
{
	num[y]=ma[x][y];
	tree[x][lor]=y;
	ma[x][y]=-1;
	ma[y][x]=-1;
	maketree(y);
}
void maketree(int v)
{
	int lr=0;
	for(int i=0;i<=n;i++)
	{
		if(ma[v][i]>=0)
		{
			lr++;
			build(v,i,lr);
			if(lr==2) return;
		}
	}
}
void dfs(int v,int k)
{
	if(k==0) f[v][k]=0;
	else if(tree[v][1]==0 && tree[v][2]==0) f[v][k]=num[v];
	else
	{
		f[v][k]=0;
		for(int i=0;i<k;i++)
		{
			if(f[tree[v][1]][i]==0) dfs(tree[v][1],i);
			if(f[tree[v][2]][k-i-1]==0) dfs(tree[v][2],k-i-1);
			f[v][k]=max(f[v][k],f[tree[v][1]][i]+f[tree[v][2]][k-i-1]+num[v]);
		}
	}
}
int main()
{
	freopen("ecappletree.in","r",stdin);
	freopen("ecappletree.out","w",stdout);
	scanf("%d%d",&n,&q);
	first();
	for(int i=0;i<n-1;i++)
	{
		int x,y,xy;
		scanf("%d%d%d",&x,&y,&xy);
		ma[x][y]=xy;
		ma[y][x]=xy;
	}
	maketree(1);
	dfs(1,q+1);
	printf("%d",f[1][q+1]);
	return 0;
}