杂题选讲 #2:广义串并联图

· · 算法·理论

定义与性质

定义

什么是广义串并联图?

形式化地说,不存在同胚于 K_4(即一个有 4 个点的完全图)的子图的无向图被称为广义串并联图。

你可能不知道这是什么意思。通俗地说,就是不存在四个结点,满足其两两之间都有一条路径相连,且这些路径互不相交。

举例:树与仙人掌都是广义串并联图。

性质

广义串并联图有一系列的优秀性质:

  1. 广义串并联图是平面图;
  2. 广义串并联图可以通过以下的操作变成一个单点:
    • 删一度点(去断路):选择一个度数为 1 的点并删掉它和与它连接的边;
    • 缩二度点(消串联):选择一个度数为 2 的点,用一条边替换它和与它相连的两条边(你可以理解为把它与连接它的两条边“缩”成一条边);
    • 叠合重边(消并联):选择两条重边,用一条边替换它们;
  3. 广义串并联图在进行上述操作中,每一条边都对应原图的一个子图。
  4. 上面的三种操作在一般图中的体现称为“广义串并联图方法”。对于一般图 G=(V,E),令 n=|V|m=|E|,如果满足 m-n\le k,其中 k 很小,那么运用广义串并联图方法对图进行操作可以使原图满足 n\le 2km\le 3k,然后一些题可以直接暴力做。证明考虑三种操作中 m-n 的值都不增,并且因为不能进行操作时已经满足每个点的度数都大于 3,所以 3n\le 2m,于是 n\le 2km\le 3k

值得注意的是,对广义串并联图的操作不是白做的。在进行操作时,由于图的形态发生改变,点 / 边上记录的值(就是各种贡献)可能会发生改变。

广义串并联图的题目通常的难点在于探究对于每种操作前后贡献的变化;接下来我们将用实例说明操作对贡献的影响可能是什么样的。

[SNOI2020] 生成树

题意简述

给定一个图,保证该图删掉一条边后是仙人掌。求该图的生成树个数。答案对 998244353 取模。

数据范围:1\le|V|\le|E|\le 5\times 10^5

题目信息

来源:陕西省 NOI 省队选拔赛 2020 D1T1

难度:\color{Darkblue}\texttt{NOI/NOI+/CTSC}

提示

或许你忘了什么是仙人掌;仙人掌是不存在两个拥有公共边的简单环的无向连通图。

解法

如果数据范围比较小可以矩阵树定理直接暴做,但是这题可能连 10 分都过不去(n=m=200010 分)。

观察到原图是广义串并联图。考虑原图为什么是广义串并联图:先考虑一个仙人掌,从中取出 4 个点,两两之间最多有 4 条路径(因为仙人掌不存在两个拥有公共边的简单环);再加一条边顶多 5 条路径,达不到 6 条路径。

怎么用广义串并联图方法?

将贡献缩到边上面(前面说过一条边代表一个子图),一条边 (u,v)(准确地说是这个子图)最后的可能只有两种:(u,v) 连通与不连通。

令一条边 e 连通的方案数为 f(e),不连通的方案数为 g(e)。用一个变量 s 记录最终答案,初始时 s\gets 1

那么,如何具体实现上述的操作?

对于每条边,开一个结构体记录两端点以及 fg,用 std::set 存边,这样便于删边。

用队列模拟操作过程,每次把满足条件的一度点与二度点扔进去。重边在输入的时候就提前都叠起来,广搜的时候就不用处理重边了。

参考代码(C++17):

提交记录 #354414 - QOJ.ac

练习题 & 总结

该类型的习题较多,这里推荐几道比较经典的:

在 OI 中比较常用的是广义串并联图方法,只需牢牢记住三种操作“删一度点”“缩二度点”“叠合重边”,即“去断路”“消串联”“消并联”,并且能较好地计算操作中贡献的变化,就可以解决大部分的相关问题。