| 比赛 | 
    EYOI与SBOI开学欢乐赛7th | 
    评测结果 | 
    AAAAAAATTTTTAA | 
    | 题目名称 | 
    重建道路 | 
    最终得分 | 
    64 | 
    | 用户昵称 | 
    HeSn | 
    运行时间 | 
    5.708 s  | 
    | 代码语言 | 
    C++ | 
    内存使用 | 
    3.28 MiB  | 
    | 提交时间 | 
    2022-09-23 20:16:20 | 
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m, size[210], fa[210], ans, vis[210], f[210];
vector<int> cd[210];
void dfs(int x) {
//	cout << x << ' ';
	size[x] += 1;
	for(int i = 0; i < cd[x].size(); i ++) {
		int u = cd[x][i];
		if(u == fa[x]) {
			continue;
		}
		dfs(u);
		size[x] += size[u];
	}
}
void dfs2(int x, int s, int c) {
//	cout << x << ' ';
	f[s] = min(f[s], c);
	for(int i = 0; i < cd[x].size(); i ++) {
		int u = cd[x][i];
		if(vis[u] || u == fa[x]) {
			continue;
		}
		dfs2(u, size[u], c + 1);
		dfs2(u, s, c);
		vis[u] = 1;
		dfs2(x, s - size[u], c + 1);
		vis[u] = 0;
	}
}
signed main() {
	freopen("reroads.in", "r", stdin);
	freopen("reroads.out", "w", stdout);
	cin >> n >> m;
	for(int i = 1; i < n; i ++) {
		int x, y;
		cin >> x >> y;
		cd[x].push_back(y);
		fa[y] = x;
	}
	dfs(1);
//	for(int i = 1; i <= n; i ++) {
//		cout << size[i] << ' ';
//	}
//	cout << endl;
	memset(f, 0x3f, sizeof(f));
	dfs2(1, n, 0);
//	for(int i = 1; i <= n; i ++) {
//		cout << f[i] << ' ';
//	}
	cout << f[m];
//	cout << min(f[m], f[n - m]);
    return 0;
}