比赛 动规 评测结果 AAAAAAAAAAAAA
题目名称 二叉苹果树 最终得分 100
用户昵称 皓芷 运行时间 0.005 s
代码语言 C++ 内存使用 0.40 MiB
提交时间 2017-06-18 20:50:15
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#define mysister
#define maxn 105
using namespace std;
int s[maxn][3],f[maxn][maxn],t[maxn][maxn],num[maxn],n,q,u,v,m;
void maketree(int u);
void build(int u,int v,int lor)
{
	s[u][lor]=v;
	f[v][1]=num[v]=t[u][v];
	t[u][v]=t[v][u]=-1;
	maketree(v);
}
void maketree(int u)
{
	int lor=0;
	for(int i=1;i<=n;i++)
	  if(t[u][i]>=0)
	  {
	  	lor++;
	  	build(u,i,lor);
	  	if(lor==2)break;
	  }
}
void dfs(int u,int k)
{
	if(k==0)f[u][k]=0;
	else if(s[u][1]==0)f[u][k]=num[u];
	else
	{
	  for(int i=0;i<k;i++)
	  {
	  	if(f[s[u][1]][i]==-1)dfs(s[u][1],i);
	  	if(f[s[u][2]][k-i-1]==-1)dfs(s[u][2],k-i-1);
	  	f[u][k]=max(f[u][k],f[s[u][1]][i]+f[s[u][2]][k-i-1]+num[u]);
	  }
	}
}
int main()
{
	freopen("ecappletree.in","r",stdin);
	freopen("ecappletree.out","w",stdout);
	scanf("%d%d",&n,&q);
	memset(f,-1,sizeof(f));
	memset(t,-1,sizeof(t));
	for(int i=1;i<n;i++)
	{
	  scanf("%d%d%d",&u,&v,&m);
	  t[u][v]=m;
	  t[v][u]=m;
	}
	maketree(1);
	dfs(1,q+1);
	printf("%d",f[1][q+1]);
	return 0;
}