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

暴力可过

posted @ 2024-10-17 20:47  libohan0518  阅读(0)  评论(0编辑  收藏  举报