噩梦。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int N,P;
vector<int>son[160];
int vis[160],dp[160][160],Start;
int dfs(int n){//printf("~%d\n",n);
int sum=1,len=son[n].size();
vis[n]=1;
if(n==Start) dp[n][1]=len;
else dp[n][1]=len+1;
for(int i=0;i<len;i++)
{
if(vis[son[n][i]]) continue;
int m=dfs(son[n][i]); sum+=m;
for(int j=sum;j>=2;j--){
for(int k=1;k<j;k++){
if(dp[n][j]>dp[n][j-k]+dp[son[n][i]][k]-2)
dp[n][j]=dp[n][j-k]+dp[son[n][i]][k]-2;
}
}
}
// for(int x=0;x<=P;x++) printf("%d ",dp[n][x]);printf("\n");
return sum;
}
int main()
{
int i,j,k;
while(scanf("%d%d",&N,&P)!=EOF){
memset(vis,0,sizeof(vis));
memset(dp,1,sizeof(dp));//printf("!%d!\n",dp[10][10]);
for(i=1;i<=N;i++) son[i].clear();
for(i=1;i<=N-1;i++){
scanf("%d%d",&j,&k);
son[j].push_back(k);
vis[k]=1;
}
for(i=1;i<=N;i++)
if(vis[i]!=1){
memset(vis,0,sizeof(vis));
Start=i;
dfs(i);
break;
}
k=999999999;
for(i=1;i<=N;i++)
if(k>dp[i][P])
k=dp[i][P];
printf("%d\n",k);
}
return 0;
}
/*
11 4
1 2
1 3
1 4
1 5
2 6
2 7
2 8
4 9
4 10
4 11
答案是1
*/
http://blog.sina.com.cn/s/blog_53406c7d0100j808.html