比赛 |
动规 |
评测结果 |
AAATAATTAAATA |
题目名称 |
二叉苹果树 |
最终得分 |
69 |
用户昵称 |
玉带林中挂 |
运行时间 |
4.019 s |
代码语言 |
C++ |
内存使用 |
0.40 MiB |
提交时间 |
2017-06-18 21:09:12 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<string>
using namespace std;
int tree[105][5]={0},mm[105][105]={0},num[105]={0},f[105][105]={0};
int n,q;
//f[i][j]表示以i,j为节点的根保留k条边的最大值
int max(int a,int b)
{
return a>b?a:b;
}
void build(int x,int y,int lor);
void maketree(int v)
{
int lr=0;
for(int i=0;i<=n;i++)
if(mm[v][i]>=0)
{
lr++;
build(v,i,lr);
if(lr==2) return;
}
}
void build(int x,int y,int lor)//lor 左或右,left or right
{
num[y]=mm[x][y];
tree[x][lor]=y;
mm[x][y]=-1;
mm[y][x]=-1;
maketree(y);
}
void dfs(int v,int k)
{
if(k==0) f[v][k]=0;
else if (tree[v][1]&&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]));
//f[tree[v][1]][i]是它的左侧i条边的最大值,f[tree[v][2]][k-i-1]是右侧i条边的最大值,num[v]表示它的根节点的数
}
}
}
int main()
{
freopen("ecappletree.in","r",stdin);freopen("ecappletree.out","w",stdout);
cin>>n>>q;
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
{
mm[i][j]=-1;
mm[j][i]=-1;
}
for(int i=0;i<n;i++)
{
int x,y,xy;
scanf("%d%d%d",&x,&y,&xy);
mm[x][y]=xy;
mm[y][x]=xy;
}
//建树;
maketree(1);
dfs(1,q+1);
cout<<f[1][q+1];
fclose(stdin);fclose(stdout);
return 0;
}