您的位置:首页 > 移动开发

Timus 1018 Binary Apple Tree

2013-04-07 21:17 295 查看
http://acm.timus.ru/problem.aspx?space=1&num=1018

类型:树dp

AC Code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[105][105],val[105]={0},tree[105][3],f[105][105],n;
void buildtree(int root)
{
int lr=0;
for(int i=1;i<=n;i++)
if(a[root][i]>0){
if(lr==2)
return;
lr++;
tree[root][lr]=i;
val[i]=a[root][i];
a[i][root]=-1;
buildtree(i);
}
}
void dfs(int root,int num)
{
if(num==0){
f[root][num]=0;
return;
}
else if(tree[root][1]==0&&tree[root][2]==0){
f[root][num]=val[root];
return;
}
else{
for(int i=0;i<num;i++){
if(f[tree[root][1]][i]==0)dfs(tree[root][1],i);
if(f[tree[root][2]][num-1-i]==0)dfs(tree[root][2],num-1-i);
f[root][num]=max(f[root][num],f[tree[root][1]][i]+f[tree[root][2]][num-1-i]+val[root]);
//if(root==1&&num==3)
//printf("f=%d\n",f[1][3]);
}
}
}
void print()
{
for(int i=1;i<6;i++)
printf("%d %d \n",tree[i][1],tree[i][2]);
printf("\n");
for(int i=1;i<6;i++)
printf("%d\n",val[i]);
printf("\n");
}
int main()
{
int m;
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
memset(val,0,sizeof(val));
memset(f,0,sizeof(f));
memset(tree,0,sizeof(tree));
for(int i=1;i<n;i++){
int xx,yy,val;
scanf("%d%d%d",&xx,&yy,&val);
a[xx][yy]=val;
a[yy][xx]=val;
}
buildtree(1);
//print();
dfs(1,m+1);
printf("%d\n",f[1][m+1]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: