比赛 动规 评测结果 AAAAAAAAAAAAA
题目名称 二叉苹果树 最终得分 100
用户昵称 swttc 运行时间 0.006 s
代码语言 C++ 内存使用 0.49 MiB
提交时间 2017-06-18 21:35:41
显示代码纯文本
#include<iostream>
#include<cstdio>

using namespace std;

int n,q,num[150],tt[150][3],f[150][150],ma[150][150],vis[150];

void build(int pos)
{
	vis[pos]=1;
	for(int i=1;i<=n;i++)
	{
		if(ma[pos][i]!=-1&&vis[i]==0)
		{
			num[i]=ma[pos][i];
			ma[pos][i]=ma[i][pos]=-1;
			if(!tt[pos][1])
		 	 tt[pos][1]=i;
		 	else
		 	 tt[pos][2]=i;
			build(i);
		}
	}
	return;
}

void dfs(int pos,int k)
{
	if(f[pos][k]) return;
	if(k==0) f[pos][k]=0;
	else
	{
		if(tt[pos][1]==0&&tt[pos][2]==0) f[pos][k]=num[pos];
		else
		{
			for(int i=0;i<k;i++)
			{
				dfs(tt[pos][1],i);
				dfs(tt[pos][2],k-i-1);
				f[pos][k]=max(f[pos][k],f[tt[pos][1]][i]+f[tt[pos][2]][k-i-1]+num[pos]);
			}
		}
	}
	return;
}

int main()
{
	freopen("ecappletree.in","r",stdin);
	freopen("ecappletree.out","w",stdout);
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	  ma[i][j]=-1;
	int a,b,c;
	while(scanf("%d%d%d",&a,&b,&c)==3)
	{
		ma[a][b]=c;
		ma[b][a]=c;
	}
	build(1);
	dfs(1,q+1);
	/*int ans=-1;
	for(int i=1;i<=2;i++)
	{
		ans=max(ans,f[tt[1][i]][q]); 
	}*/
	printf("%d",f[1][q+1]);
	return 0;
}