比赛 动规 评测结果 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;
}