#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int N=305,INF=1000000000;
int n,m,k,id,head[N],f[N][N][2];
bool vis[N];
struct tree
{
int l,r,f,w;
}t[N];
struct edge
{
int u,v,w,nx;
}e[2*N];
void add(int u,int v,int w)
{
id++;
e[id].u=u;
e[id].v=v;
e[id].w=w;
e[id].nx=head[u];
head[u]=id;
}
void dfs(int x)
{
if(x==0) return;
int z=x;
int i=head[x];
int v;
while (i!=0)
{
v=e[i].v;
if(vis[v])
{
i=e[i].nx;
continue;
}
vis[v]=true;
if(z==x) t[z].l=v;
else t[z].r=v;
t[v].w=e[i].w;
z=v;
dfs(v);
i=e[i].nx;
}
}
void init()
{
int x,y,z;
vis[1]=true;
for(int i=0;i<=n;i++)
for(int j=0;j<=k;j++)
f[i][j][0]=f[i][j][1]=INF;
for(int i=1;i<n;i++)
{
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
dfs(1);
}
int dp(int x,int y,int z)
{
int t1,t2;
if(x==0 && y==0) return f[x][y][z]=0;
if(x==0 || y<0) return INF;
//if(x==0 || y==0) return INF;
if(f[x][y][z]!=INF) return f[x][y][z];
for(int i=0;i<=y;i++)
{
t1=dp(t[x].l,i,0)+(z==0 && m==2)*t[x].w;
t2=dp(t[x].l,i-1,1)+(z==1)*t[x].w;
f[x][y][z]=min(f[x][y][z],min(t1,t2)+dp(t[x].r,y-i,z));
}
//cout<<x<<' '<<y<<' '<<z<<' '<<f[x][y][z]<<endl;
return f[x][y][z];
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n>>m>>k;
if(m-1+k>n)
{
cout<<"-1";
return 0;
}
init();
cout<<dp(t[1].l,k-1,1);
return 0;
}
评测数据 :https://www.luogu.com.cn/record/83427854