现在的位置: 首页 > 综合 > 正文

zoj3201 Tree of Tree

2014年08月29日 ⁄ 综合 ⁄ 共 983字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<memory.h>
#include<time.h>

using namespace std;

#define inf 200000000

long long dp[109][109],ans,w[109];
int head[109],cnt,n,k;

struct Node
{
	long long from,to;
}node[500];

void clear()
{
	memset(node,0,sizeof(node));
	memset(head,-1,sizeof(head));
	memset(dp,0,sizeof(dp));
	cnt=0;
}

void add(int a,int b)
{
	node[cnt].from=b;
	node[cnt].to=head[a];
	head[a]=cnt++;
	ans=-inf;
}

void dfs(int u,int fa)
{
	for(int i=0;i<=k;++i)
		dp[u][i]=-inf;
	dp[u][1]=w[u];
	for(int j=head[u];j!=-1;j=node[j].to)
	{
		int v=node[j].from;
		if(v!=fa)
		{
			dfs(v,u);
			for(int l=k;l>=1;--l)
			{
				for(int i=k;i>=1;--i)
				{
					if(dp[v][i]==-inf)continue;
					if(l+i>k || dp[u][l]==-inf)continue;
					dp[u][l+i]=max(dp[v][i]+dp[u][l],dp[u][l+i]);
				}
			}
		}
	}
	ans=max(ans,dp[u][k]);
}

int main()
{
	while(scanf("%d %d",&n,&k)!=EOF)
	{
		clear();
		for(int i=0;i<n;++i)
			scanf("%lld",&w[i]);
		for(int i=1;i<n;++i)
		{
			int a,b;
			scanf("%d %d",&a,&b);
			add(a,b);
			add(b,a);
		}
		dfs(0,-1);
		cout<<ans<<endl;
	}
	return 0;
}

抱歉!评论已关闭.