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