20240904
Changes in Antwanland
我们可以考虑直接枚举根,我们假设从根出发的深度为 \(i\) 的结点数量为 \(cnt_i\) ,那么我们只需要找到第一个 \(cnt_1 + cnt_2 + ... + cnt_x \geq k\) 即可,但是一个点的中心有可能可以在边上,所以跑两边即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e3 + 5;
int n, k, cnt[N], ans = 1e9;
bool vis[N];
vector<int> g[N];
void dfs(int u, int f, int dep) {
cnt[dep]++;
for (auto v : g[u]) {
if (v != f && !vis[v]) {
dfs(v, u, dep + 1);
}
}
}
signed main() {
cin >> n >> k;
for (int i = 1, u, v; i < n; i++) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
fill(cnt, cnt + n + 1, 0);
dfs(i, 0, 0);
int sum = 0;
for (int j = 0; j <= n; j++) {
sum += cnt[j];
if (sum >= k) {
ans = min(ans, j * 2 + 1);
}
}
}
for (int u = 1; u <= n; u++) {
for (auto v : g[u]) {
vis[v] = vis[u] = true;
fill(cnt, cnt + n + 1, 0);
dfs(v, 0, 0);
dfs(u, 0, 0);
int sum = 0;
for (int j = 0; j <= n; j++) {
sum += cnt[j];
if (sum >= k) {
ans = min(ans, j * 2 + 2);
}
}
vis[v] = vis[u] = false;
}
}
cout << ans;
return 0;
}
Depth Range Update
暴力可过