求助找树上定大连通块与外连边数量最小值
#include<bits/stdc++.h>
using namespace std;
int n,p,u,v,f[160][160],cnt,head[160],ans=0x3f3f3f3f;
vector<int> G[160];
struct node{int to,next;}edge[310];
void add(int x,int y) {edge[++cnt]=(node){y,head[x]};head[x]=cnt;}
void dfs(int u,int fa)
{
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa) continue;
G[u].push_back(v);
dfs(v,u);
}
}
void Dfs(int u)
{
for(auto i:G[u])
{
Dfs(i);
for(int j=n;j>=1;j--)
{
f[u][j]++;
for(int k=0;k<j;k++) f[u][j]=min(f[u][j],f[u][j-k]+f[i][k]);
}
}
}
int main()
{
cin>>n>>p;
for(int i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);
memset(f,0x3f,sizeof(f));for(int i=1;i<=n;i++) f[i][1]=1;
dfs(1,0);Dfs(1);f[1][p]--;for(int i=1;i<=n;i++) ans=min(ans,f[i][p]);cout<<ans;
}
input:
11 6
1 2
1 3
1 4
1 5
2 6
2 7
2 8
4 9
4 10
4 11
standard output:
2