傻逼dp题。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
#define INF (INT_MAX/2-10000000)
#define N 3010
using namespace std;
inline int inn()
{
int x,ch;while((ch=gc)<'0'||ch>'9');
x=ch^'0';while((ch=gc)>='0'&&ch<='9')
x=(x<<1)+(x<<3)+(ch^'0');return x;
}
struct edges{
int to,pre,wgt;
}e[N<<1];int h[N],etop,dp[N][3][N],tmp[3][N],sz[N];
inline int add_edge(int u,int v,int w)
{
return e[++etop].to=v,e[etop].pre=h[u],h[u]=etop,e[etop].wgt=w;
}
int dfs(int x,int fa,int k)
{
for(int i=2;i<=k;i++)
dp[x][0][i]=dp[x][1][i]=dp[x][2][i]=INF;
sz[x]=1;
for(int i=h[x],y;i;i=e[i].pre) if((y=e[i].to)^fa)
{
dfs(y,x,k);int w=e[i].wgt;
for(int j=0;j<3;j++) memcpy(tmp[j]+1,dp[x][j]+1,sizeof(int)*min(k,sz[x]+sz[y]));
for(int p=1;p<=min(sz[x],k);p++)
for(int q=1;q<=min(sz[y],k-p);q++)
tmp[0][p+q]=min(tmp[0][p+q],dp[x][0][p]+dp[y][0][q]+2*w),
tmp[1][p+q]=min(tmp[1][p+q],min(dp[x][0][p]+dp[y][1][q]+w,dp[x][1][p]+dp[y][0][q]+2*w)),
tmp[2][p+q]=min(tmp[2][p+q],dp[x][0][p]+dp[y][2][q]+2*w),
tmp[2][p+q]=min(tmp[2][p+q],dp[x][2][p]+dp[y][0][q]+2*w),
tmp[2][p+q]=min(tmp[2][p+q],dp[x][1][p]+dp[y][1][q]+w);
for(int j=0;j<3;j++) memcpy(dp[x][j]+1,tmp[j]+1,sizeof(int)*min(k,sz[x]+sz[y]));
sz[x]+=sz[y];
}
return 0;
}
int main()
{
int n=inn(),k=inn();
if(k==1) return !printf("0\n");
for(int i=1,u,v,w;i<n;i++)
u=inn(),v=inn(),w=inn(),
add_edge(u,v,w),add_edge(v,u,w);
dfs(1,0,k);int ans=INF;
for(int i=1;i<=n;i++)
// debug(i)sp,debug(dp[i][1][k])sp,debug(dp[i][2][k])ln,
ans=min(ans,min(dp[i][1][k],dp[i][2][k]));
return !printf("%d\n",ans);
}