文章目录

CSES 1704 Network Renovation 做题笔记

发布于

题意

给定一颗 $n$ 个节点的树,要求添加尽可能少的边,使得任意删除一条边之后,整个图依然联通。

$3 \leq n \leq 10^5$

题解

首先给出结论:仅需要添加 $\lceil\dfrac m2\rceil$ 条边,其中 $m$ 为叶子节点的数量。构造方法为:从任意一个非叶子节点开始 DFS,按 DFS 顺序给每个叶子节点编号,依次为 $1$ 到 $m$。每次连接叶子 $i$ 和叶子 $i + \lfloor\dfrac m2\rfloor$。

因为每增加一条边,最多会让两个叶子符合要求,因此 $\lceil\dfrac m2\rceil$ 就是下界。

代码

void STRUGGLING([[maybe_unused]] unsigned TEST_NUMBER) {
  tp n, rt = 0, leaf = 0; bin >> n;
  vector<tp> deg(n + 1, 0), tid(n + 1);
  vector<vector<tp>> e(n + 1);
  for (tp i = 1; i < n; ++i) {
    tp u, v; bin >> u >> v;
    e[u].push_back(v);
    e[v].push_back(u);
    ++deg[u]; ++deg[v];
  }
  for (tp i = 1; i <= n; ++i) {
    if (deg[i] != 1) rt = i;
  }
  auto dfs = [&](auto& _, tp x, tp f) -> void {
    if (deg[x] == 1) tid[++leaf] = x;
    for (auto& i : e[x]) {
      if (i != f) _(_, i, x);
    }
  };
  dfs(dfs, rt, rt);
  bin << (leaf + 1) / 2 << '\n';
  for (tp i = 1; i <= (leaf + 1) / 2; ++i) bin << tid[i] << ' ' << tid[i + leaf / 2] << '\n';
}

暂无评论

发表评论