记录编号 575822 评测结果 AAAAAAAAAAAAAA
题目名称 重建道路 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2022-09-28 20:15:53 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define pb emplace_back

const int INF = 0x3f3f3f3f;
const int maxn = 205;
std::vector<int> G[maxn];
int n,sz[maxn],f[maxn][maxn],ans,m;

void dfs(int u,int fa) {
	memset(f[u] , 0x3f , sizeof(f[u]));
	f[u][1] = G[u].size();
	sz[u] = 1;
	for(auto& v : G[u]) {
		if(v == fa)continue ;
		dfs(v , u);
		int res[maxn];
		memset(res , 0x3f , sizeof(res));
		for(int j = 1;j <= sz[u];++ j) {
			for(int k = 1;k <= sz[v];++ k) {
				res[j + k] = std::min(res[j + k] , f[u][j] + f[v][k] - 2);
			}
		}
		sz[u] += sz[v];
		for(int i = 1;i <= sz[u];++ i)f[u][i] = std::min(f[u][i] , res[i]);
	}
	if(sz[u] >= m)ans = std::min(ans , f[u][m]);
	return ;
}

int main() {
	freopen("reroads.in","r",stdin);
	freopen("reroads.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i = 1;i < n;++ i) {
		int u,v;
		scanf("%d %d",&u,&v);
		G[u].pb(v);
		G[v].pb(u);
	}

	ans = INF;
	dfs(1 , 0);

	printf("%d\n",ans);
	return 0;
}