比赛 |
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;
}