比赛 动规 评测结果 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;
}