C. Link Cut Centroids ~木の重心~

  • 問題説明

重心が1つのみの木を作りたい。辺を1つ削除し、辺を1つ追加して新たな木としてよい時、それは可能。その操作(辺の追加・削除)を構築せよ

f:id:peroon:20210619183536p:plain

  • その他
    • 木の重心を求める関数を使いました記念
    • 下記のコドフォURL内の関数を微修正したのみ。centroidを求めるコードの理解はしていない
// 木の重心(最大2つ)
// https://codeforces.com/blog/entry/57593
VI Centroid(const VV &g) {
  int n = g.size();
  VI centroid;
  VI sz(n);
  function<void (int, int)> dfs = [&](int u, int prev) {
    sz[u] = 1;
    bool is_centroid = true;
    for (auto v : g[u]) if (v != prev) {
      dfs(v, u);
      sz[u] += sz[v];
      if (sz[v] > n / 2) is_centroid = false;
    }
    if (n - sz[u] > n / 2) is_centroid = false;
    if (is_centroid) centroid.push_back(u);
  };
  dfs(0, -1);
  return centroid;
}

蟻本

  • 蟻本v2 p320に「木の重心分解」について書いてある