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