记录编号 36175 评测结果 AAAAAAAAAA
题目名称 寻宝之旅 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2012-03-09 22:30:40 内存使用 0.36 MiB
显示代码纯文本
#include <cstdlib>
#include <cstdio>
#include <vector>
using namespace std;
int N,M;
typedef vector<int> Vec;
const int INF=-10000000;
const int MAXN=111;
int Num[MAXN];
int flag[MAXN];
Vec Map[MAXN];
Vec Val[MAXN];
int F[MAXN][MAXN][2];

int MAX3(int a,int b,int c)
{
	if(b>a) a=b;
	if(c>a) a=c;
	return a;
}

int MAX2(int a,int b)
{
	return a>b?a:b;
}

void dfs(int x)
{
	flag[x]=1;
	int nxt;
	int tmp;
	for(unsigned int i=0;i<Map[x].size();i++)
	{
		nxt=Map[x][i];
		if(flag[nxt]) continue;
		dfs(nxt);
		for(int k=M;k>=1;k--)
		{
			F[x][k][0]=MAX3(F[x][k][0],F[nxt][k][0],F[nxt][k][1]);
			tmp=INF;
			for(int m=1;m<=k;m++)
				tmp=MAX3(tmp,F[x][m][1]+F[nxt][k-m][0],F[x][m][1]+F[nxt][k-m][1]);
			F[x][k][1]=MAX2(tmp,F[x][k][1]);
		}
	}
}

void init()
{
	scanf("%d %d\n",&N,&M);
	for(int i=1;i<=N;i++) scanf("%d",&Num[i]);
	int x,y;
	for(int i=1;i<=N-1;i++)
	{
		scanf("%d %d\n",&x,&y);
		Map[x].push_back(y);
		Map[y].push_back(x);
	}
	for(int i=1;i<=N;i++) flag[i]=0;
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
			F[i][j][1]=Num[i];
}

int main()
{
	freopen("seek.in","r",stdin);
	freopen("seek.out","w",stdout);
	init();
	dfs(1);	
	int Ans=MAX2(F[1][M][0],F[1][M][1]);
	printf("%d\n",Ans);
	return 0;
}