广义串并联图
一、广义串并联图的定义
广义串并联图,对于任意 \(4\) 个节点都不存在 \(6\) 条两两没有公共边的路径连接这 \(4\) 个节点中的每一对节点的无向连通图。
树,仙人掌等都是广义串并联图。
二、广义串并联图的性质
广义串并联图重要的是一种思想——将图缩合。
每次删 \(1\) 度点、缩 \(2\) 度点、叠重边。
具体就是如下三种操作:
-
将度数为 \(1\) 的点删除。
-
对于一个度数为 \(2\) 的点 \(a\),设其连接了 \((a, b)\) 和 \((a, c)\),将 \((b, a)\) 和 \((a, c)\) 缩成 \((b, c)\)。
-
对于重边,只保留一条。
可以证明,广义串并联图经过缩合后只剩下一个点。
设图 \(G = (V, E)\),\(|V| = n, |E| = m\),当 \(m - n \le k\),\(k\) 较小时,可以考虑广义串并联图。
经过如上缩合操作后,\(m - n\) 单调不增。
最终图中只剩下度数 \(\ge 3\) 的点,所以 \(m \ge \dfrac{3}{2}n, k \ge m - n \ge \dfrac{1}{2}n\)。
得到 \(n \le 2k, m \le 3k\),就将图缩合到了一个极小的范围内。
三、例题
P6790 [SNOI2020] 生成树
\(G\) 在删完一条边后是仙人掌,首先大力猜测 \(G\) 是广义串并联图。
然后考虑将 \(G\) 缩合,对于每条边 dp。
对于一条边 \(e\),设 \(f_e\) 表示这条边在生成树上的方案数,\(g_e\) 表示这条边不在生成树上的方案数。
-
删 \(1\) 度点
- 直接将 \(f_e\) 乘进总方案数。
-
缩 \(2\) 度点
-
设两条边分别为 \(x, y\),新边为 \(e\),由于生成树上 \(x\) 和 \(y\) 至少有一条边存在,新边在生成树上当且仅当 \(x\) 和 \(y\) 都在生成树上。
-
\[\begin{cases} f_e = f_x \cdot f_y \\ g_e = f_x \cdot g_y + f_y \cdot g_x \end{cases} \]
-
-
叠重边
-
设两条重边分别为 \(x, y\),新边为 \(e\),由于生成树上 \(x\) 和 \(y\) 不能同时存在,新边不在生成树上当且仅当 \(x\) 和 \(y\) 都不在生成树上。
-
\[\begin{cases} f_e = f_x \cdot g_y + f_y \cdot g_x \\ g_e = g_x \cdot g_y \end{cases} \]
-
叠重边时可以利用 map,拓扑排序确定缩点的顺序,时间复杂度 \(\mathcal{O}(m \log m)\),如果用哈希表可以做到 \(\mathcal{O}(m)\)。