题目:
题解:
f[i][j]表示以i为根的子树,分离j个村的最少操作(包括i
那分离1个村就是ta的入度
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#define N 305
#define INF 1e9
using namespace std;
int tot,nxt[N],point[N],v[N],f[N][N],n,p,du[N],ans=INF;
void addline(int x,int y)
{
++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;
++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x;
}
void dfs(int x,int fa)
{
f[x][1]=du[x];
for (int i=point[x];i;i=nxt[i])
if (v[i]!=fa)
{
dfs(v[i],x);
for (int j=p;j>=1;j--)
for (int k=1;k<=j;k++)
f[x][j]=min(f[x][j],f[x][j-k]+f[v[i]][k]-2);
}
ans=min(ans,f[x][p]);
}
int main()
{
//f[i][j]表示以i为根的子树,分离j个村的最少操作(包括i
int i;
scanf("%d%d",&n,&p);
memset(f,0x3f,sizeof(f));
for (i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
du[x]++; du[y]++;
addline(x,y);
}
dfs(1,0);
printf("%d",ans);
}