求助
查看原帖
求助
197579
fzsxwx楼主2021/2/8 22:00
#include<iostream>
#include<cstdio>
#include<cmath>
#include<memory.h>
using namespace std;
const long long INF=0x7fffffff;
long long n,q,a,b,c,f[105][105],head[105];//f[i][j]表示以i为根节点,剩余j个条边最大值 
long long sum,father[105];
struct edges{
	int pre;
	int to;
	int val;
}edge[105];
void add_edge(int from,int to,int v)
{
	sum++;
	father[to]=from;
	edge[sum].pre=head[from];
	edge[sum].to=to;
	edge[sum].val=v;
	head[from]=sum;
}
void dp(int node,int fa)
{
	for(int i=head[node];i;i=edge[i].pre)
	{
		int u=edge[i].to,v=edge[i].val;
		if(u==fa) continue;
		dp(u,node);
		for(int j=q;j>1;j--)
			for(int k=0;k<j;k++)
				f[node][j]=max(f[node][j],f[u][k]+f[node][j-k-1]+v);
	}
}
int main()
{
	father[1]=0;
	cin>>n>>q;
	for(int i=1;i<=n-1;i++)
	{
		cin>>a>>b>>c;
		if(father[a]!=0) add_edge(a,b,c);
		else add_edge(b,a,c);
	}
	dp(1,0);//树根编号一定是1 
	cout<<f[1][q];
	return 0;
}
2021/2/8 22:00
加载中...