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

Ural 1018. A Binary Apple Tree

2010-11-24 21:15 134 查看
这道题,可以马上看出是树形Dp,f[i,j]表示以i为根的子树(还包括 [i与 i的父亲] 这条边)内,保存j条边最多可以有多少苹果,显然f[i,j]=max(f[left[i],k]+f[right[i],j-k-1])+apple[i];输出的结果是f[1][q+1],q+1是因为根节点还多了一个虚拟的边。还有,因为输入数据没告诉谁是父节点谁是子节点,要建成无向图。

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 102
using namespace std;

int tree[maxn][maxn],f[maxn][maxn],deg[maxn],n,q;

void init()
{
memset(tree,0,sizeof(tree));
memset(f,0,sizeof(f));
memset(deg,0,sizeof(deg));
}

void addedge(int a,int b,int c)
{
tree[a][b]=c;
tree[b][a]=c;
deg[a]++;
deg[b]++;
}

void dfs(int s,int fa)
{
if(deg[s]==1)
{
for(int i=1; i<=q; ++i)
f[s][i]=tree[fa][s];
return;
}
int l=0,r=0;
for(int i=1; i<=n; ++i)
{
if(tree[s][i]&&i!=fa)
{
if(!l)
l=i;
else
r=i;
}
}
dfs(l,s);
dfs(r,s);
for(int i=1; i<=q; ++i)
{
for(int k=0; k<i; ++k)
{
if(f[l][k]+f[r][i-1-k]>f[s][i])
f[s][i]=f[l][k]+f[r][i-1-k];
}
f[s][i]+=tree[fa][s];
}
}

int main(void)
{
int a,b,c;
while(scanf("%d%d",&n,&q)!=EOF)
{
init();
q++;
for(int i=0; i<n-1; ++i)
{
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
dfs(1,0);
//        for(int i=0;i<=n;++i)
//        {
//            for(int j=0;j<=n;++j)
//            {
//                cout<<f[j][i]<<" ";
//            }
//            cout<<endl;
//        }
printf("%d/n",f[1][q]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: