

#include<iostream>
#include<vector>
#define inf 0x007fffff
using namespace std;
int f[151][151];
vector<int>Tree[151];
int n,p;
void DFS(int root)
{
int i,j,k;
for(i=0;i<Tree[root].size();i++)
{
DFS(Tree[root][i]);
}
f[root][1]=Tree[root].size();
for (i=0;i<Tree[root].size();i++)
for(k=p-1;k>=1;k--)
if (f[root][k]<inf)
{
for (j=1;j<=p-1;j++)
if (f[Tree[root][i]][j]<inf)
f[root][k+j]=min(f[root][k]+f[Tree[root][i]][j]-1,f[root][k+j]);
}
return ;
}
int DP()
{
int i,j;
for(i=1;i<= n; i++)
for (j=0;j<=n;j++)
f[i][j]=inf;
DFS(1);
int res=inf;
for(i=2;i<=n;i++)
res=min(res,f[i][p]+1);
res=min(res,f[1][p]);
return res;
}
int main()
{
scanf("%d%d",&n,&p);
int i,j,a,b;
for(i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
Tree[a].push_back(b);
}
printf("%d\n",DP());
system("pause");
return 0;
}
f[i][j+k]=min(f[i][j+k],f[i.son[t]][k])(t為i的孩子)
#include <cstring>
#include <algorithm>
using namespace std;
int n, p, rt, f[155][155], siz[155];
int e, to[155], h[155], nx[155];
bool vis[155];
void dfs(int u){
siz[u] = 1;
int k = 1;
for(int i = h[u]; i; i = nx[i]){
k++;
dfs(to[i]);
siz[u] += siz[to[i]];
}
f[u][siz[u]] = 0;
f[u][1] = k;
}
void dp(int u){
if(siz[u] == 1) return;
for(int i = h[u]; i; i = nx[i]){
int v = to[i];
dp(v);
for(int j = siz[u]; j > 0; j--){
f[u][j] = min(f[u][j], f[u][j+siz[v]]+1);
for(int k = siz[v]; k > 0; k--){
f[u][j] = min(f[u][j], f[u][j+siz[v]-k]+f[v][k]);
}
}
}
}
int main()
{
while(scanf("%d %d", &n, &p)){
memset(f, 0x3f, sizeof f);
memset(h, 0, sizeof h);
memset(to, 0, sizeof to);
memset(siz, 0, sizeof siz);
memset(nx, 0, sizeof nx);
memset(vis, 0, sizeof vis);
for(int i = 1; i < n; i++){
int u, v;
scanf("%d %d", &u, &v);
to[++e] = v;
nx[e] = h[u];
h[u] = e;
vis[v] = 1;
}
for(int i = 1; i <= n; i++)
if(!vis[i]){rt = i; break;}
dfs(rt);
dp(rt);
int ans = 1<<30;
for(int i = 1; i <= n; i++)
if(siz[i] >= p) ans = min(ans, f[i][p]+(i!=rt));
printf("%d\n", ans);
}
return 0;
}