题目是U53878 【数据加强版】道路重建,调了半天A不了,谁能帮我看看
#include<bits/stdc++.h>
using namespace std;
//#define int long long
int n,m,ans=INT_MAX,a[100005],sze[100005];
int head[100005],tot;
struct Node
{
int nxt,to;
} edge[100005];
void add(int x,int y)
{
edge[++tot]=Node {head[x],y},head[x]=tot;
}
int dp[100000005];
void dfs1(int now)
{
a[now]++;
for(int i=head[now]; i; i=edge[i].nxt) dfs1(edge[i].to),a[now]+=a[edge[i].to];
dp[now*m+a[now]]=1,dp[now*m]=0;
}
void dfs(int now)
{
sze[now]=1;
for(int i=head[now]; i; i=edge[i].nxt)
{
dfs(edge[i].to);
for(int j=min(a[now]-1,sze[now]+sze[edge[i].to]); j; j--)
for(int k=max(1,j-sze[now]); k<=j; k++)
dp[now*m+j]=min(dp[now*m+j],dp[now*m+j-k]+dp[edge[i].to*m+k]);
sze[now]+=sze[edge[i].to];
}
if(a[now]>=m) ans=min(ans,dp[now*m+a[now]-m]+dp[now*m+a[now]]);
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1,x,y; i<n; i++) cin>>x>>y,add(x,y);
memset(dp,0x3f,sizeof(dp));
dfs1(1);
dp[1*m+a[1]]=0;
dfs(1);
cout<<ans;
return 0;
}