传送门 :
思路状态表示: f [ u ] [ k ] f[u][k] f[u][k]表示以 u u u为根的树中保留 k k k个点需要删除的最小边数
状态转移 f [ u ] [ k ] = m i n ( f [ u ] [ k ] , f [ u ] [ j ] + f [ k − j ] − 2 ) f[u][k] = min(f[u][k],f[u][j]+f[k-j]-2) f[u][k]=min(f[u][k],f[u][j]+f[k−j]−2)
显然我们可以将第二位想象成 背包问题来解决
因为我们在 f [ u ] = 1 f[u]=1 f[u]=1的时候已经计算了一次 1 1 1,第二次再计算 f [ x ] f[x] f[x]的时候重复计算了所以需要减去 2 2 2
Mycodeconst int N = 160,INF = 0x3f3f3f3f3f;
int n,p;
vector g[N];
int f[N][N];
int ans;
//f[u][k] 表示以u为根节点 保留k个节点 需要删除最少的边
int deg[N];
void dfs(int u,int fa){
f[u][1] = deg[u];//全切完只保留自己
for(auto x : g[u]){
if(x == fa)continue;
dfs(x,u);
for(int j = p ; j>=1 ;j -- )
for(int k = 1;k>n>>p;
for(int i=1;i>a>>b;
deg[a] ++ ,deg[b] ++ ;
g[a].pb(b);g[b].pb(a);
}
memset(f,0x3f,sizeof f);
dfs(1,0);
for(int i=1;i
关注
打赏