超级暴力的树 。
m^3的复杂度 。
对每个树的左右两个孩子进行组合。
组合的为左边1——m 个边和右边1——m个边
然后求出以此个节点为父节点时 保存边数等于1 到m 的分别的最大值 。
#include <bits/stdc++.h>
using namespace std;
#define mo 105
#define pus push_back
struct node
{
int x,y;
};
vector< node > d[105];
int dp[mo][mo];
int n,m;
node mk(int x,int y)
{
node d;
d.x=x;
d.y=y;
return d;
}
void dfsmx(int re,int v,int a[],int s,int sum,int node)
{
if(v==re)
{
if(node !=1)dp[node][sum+1]=max(dp[node][sum+1],dp[node][1]+s);
else dp[node][sum]=max(dp[node][sum],dp[node][0]+s);
return ;
}
for(int i=0;i<=m;i++)
dfsmx(re,v+1,a,s+dp[a[v]][i],sum+i,node);
}
int dfs(int node ,int dad, int s)
{
dp[node][1]=s;
int a[2];
int le=0;
for(int i=0;i<d[node].size();i++)
{
int son=d[node][i].x;
int l=d[node][i].y;
if(son!=dad)
{
dfs(son,node,l);
a[le++]=son;
}
}
if(le) dfsmx(le,0,a,0,0,node);
}
int main()
{
while(cin>>n>>m)
{
node a;
int x,y,z;
for(int i=0;i<n-1;i++)
{
cin>>x>>y>>z;
d[x].pus(mk(y,z));
d[y].pus(mk(x,z));
}
dfs(1,0,0);
cout<<dp[1][m]<<endl;
}
}