39分求助
查看原帖
39分求助
186138
ywsh27楼主2022/10/17 23:58
#include<bits/stdc++.h>
using namespace std;
struct Node{
	int nex,val,to;
}edge[201];
int heads[101],num;
inline void add(int u,int v,int w)
{
	++num;
	edge[num].to=v;
	edge[num].val=w;
	edge[num].nex=heads[u];
	heads[u]=num;
}
int n,q,ls[101],rs[101],lval[101],rval[101],dp[101][101],son[101];
void dfs1(int node,int fa)
{
	son[node]=1;
	for(int i=heads[node];i;i=edge[i].nex)
	{
		if(edge[i].to==fa)continue;
		dfs1(edge[i].to,node);
		son[node]+=son[edge[i].to];
	}
}
void findout(int node,int fa)
{
	int ls=-1,rs=-1,lval=0,rval=0;
	for(int i=heads[node];i;i=edge[i].nex)
	{
		if(edge[i].to==fa)continue;
		if(ls==-1)ls=edge[i].to,lval=edge[i].val;
		else rs=edge[i].to,rval=edge[i].val;
	}
	if(ls==-1)return ;
	findout(ls,node);
	findout(rs,node);
	for(int i=min(son[node],q);i>0;--i)
	{
		for(int j=min(son[node],q)-1+(node==1);j>=0;--j)
		{
			int ans=0,numl=j,numr=i-j;
			if(numl>=1)ans+=lval;
			if(numr>=1)ans+=rval;
			if(numl-1>0)ans+=dp[ls][numl-1];
			if(numr-1>0)ans+=dp[rs][numr-1];
			dp[node][i]=max(dp[node][i],ans);
		}
//		cout<<node<<" "<<i<<" "<<dp[node][i]<<endl;
	}
}
signed main()
{
	int x,y,z;
	scanf("%d%d",&n,&q);
	for(int i=1;i<n;++i)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	dfs1(1,0);
	findout(1,0);
	cout<<dp[1][q];
	return 0;
}
2022/10/17 23:58
加载中...