浅谈染色技术与子图同构问题

· · 个人记录

1. 概述

注意:本文中的染色技术≠图着色算法

染色技术(color-coding)是一项在计算机科学领域应用十分广泛的技术,但它在 OI 中的应用依然停留在比较粗浅的层面。本文将简单介绍染色技术,以及它在解决子图同构问题方面的应用。最后,我会简单罗列一些染色技术在 OI 方面的应用。

由于笔者对这方面的了解还十分有限,有什么疏漏/需要补充的地方欢迎指正。

1.1 记号和约定:

1.2 前置知识

2. 子图同构问题

定义 2.1(子图同构问题) 给定点数为 n 的图 G=(V,E) 和点数为 k 的模式图 H=(V_H,E_H),问是否存在一个 G 的子图 G' 满足 G'\cong H。如果存在,输出 G' 的一种方案。

子图同构问题是 NP-hard 问题。

子图同构问题有若干特殊情况:

可以发现上面两个问题也是 NP-hard 问题,因为 k=n 时它们分别等价于哈密顿路和哈密顿回路存在性判定。第 3,4 章中会介绍 k=O(\log n) 时,上面两个问题的多项式解法。

3. 染色技术

在本节中,我们将证明,log-path problem 可以在多项式时间内求解。解法中用到的关键技术就是染色技术。

染色技术由 Alon,Yuster 和 Zwick 在 1995 年提出。其核心思想十分简单,主要分为两步:

对于 k-path problem,第二步容易使用状压 DP 解决。具体地,设 dp_{u,S} 代表是否存在一条路径,它的一个端点为 u,且恰好使用了集合 S 中的颜色。有转移 dp_{v,S\cup\{f(v)\}}\leftarrow dp_{u,s},其中 (u,v)\in E

容易发现,执行一次这样的过程,只有很小的概率得到正确答案,所以我们需要重复执行多次,每次随机挑选一个 f。不妨估算一下需要执行多少次(不想看推导的可以直接跳到结论)。

对于一条长度为 k 的路径,它所有可能的染色方案数为 k^k。其中,它成为一条合法染色路径的方案数为 k!。所以,我们找出这样一条路径的概率至少为 P=\dfrac{k!}{k^k},根据斯特林公式,P\approx \dfrac{\sqrt{2\pi k}}{e^k}

假设我们运行了 T 次,那么错误率 \epsilon=(1-P)^T,不妨来估计一下这个东西的量级。

\lambda=\dfrac{1}{P},则

\epsilon=& \left(1-\frac{1}{\lambda}\right)^T \\=&\left(\frac{\lambda-1}{\lambda}\right)^T \\=&\left(\frac{1}{1+\frac{1}{\lambda-1}}\right)^T \\=&\left(\left(\frac{1}{1+\frac{1}{\lambda-1}}\right)^{\lambda-1}\right)^{\frac{T}{\lambda-1}} \\=&\left(\frac{1}{\left(1+\frac{1}{\lambda-1}\right)^{\lambda-1}}\right)^{\frac{T}{\lambda-1}} \end{aligned}

众所周知,

\lim_{n\to \infty}{\left(1+\frac{1}{n}\right)}^n=e

所以

\epsilon ≈\left(\frac{1}{e}\right)^{\frac{T}{\lambda-1}}

结论 3.1 我们每运行 \lambda-1 次求解染色问题的算法,错误率就会大约变为原来的 \frac{1}{e}

这个结论非常有用,在 oi wiki 中也有提及。

在这个问题中 \lambda\approx 2^{O(k)},所以为了得到 1-\epsilon 的正确率,我们需要运行 -2^{O(k)}\log \epsilon 次上述算法。

而单次求解的时间复杂度是 2^{O(k)}m 的,所以我们就在 -2^{O(k)}m\log \epsilon 时间内解决了 k-path problem

k=O(\log n) 时,令 m=O(n^2),那么上面这个函数就是一个关于 n 的多项式。这样我们就证明了本节开头提到的命题。在第 4.1 小节中,我们还会提到如何将上述算法的时间复杂度优化到 -2^{O(k)}n\log \epsilon

实际上,将上述随机算法 “去随机化” 之后,我们还能得到一个时间复杂度 2^{O(k)}m\log n 的确定性算法。具体方法是构造一个大小为 2^{O(k)}\log n 的映射 f 的集合 F,使得对任意 V 的大小为 k 的子集 \{v_1,v_2,\dots v_k\},存在 f\in F,满足 \{f(v_1),f(v_2),\dots ,f(v_k)\}=\{0,1,\dots, k-1\}。不过在 OI 中并不 practical。

为了方便,后文中标注的时间复杂度默认是确定性算法的时间复杂度。

4. 染色技术的一些拓展

实际上,上述 k-path problem 的解法可以拓展到 k-tree problem(名字我瞎取的),也就是模式图 H 是一棵树的情况。

4.1 k-tree problem 的解法

H=(U,F) 看作一棵有根树,令 \operatorname{sub}(x) 代表点 x 子树中的点构成的点集。dp_{u,S,x,k} 代表 G 中是否存在 u 为根的树,它用了 S 中所有的颜色,并且它与 \{x\}\cup \operatorname{sub}(u_1)\cup \dots\cup\operatorname{sub}(u_k) 的诱导子图同构,其中 x\in Uu_1,u_2,\dots,u_kx 的儿子。 转移应该比较显然。

这样做时间复杂度是 2^{O(k)}m\log n 的。利用一个引理,我们可以将时间复杂度优化到 2^{O(k)}n\log n

引理 4.1.1m\ge (k-1)n,那么 G 中包含任意点数为 k 的树。

更一般地,对于树宽度为 t 的模式图 H,子图同构问题存在时间复杂度 2^{O(k)}n^{t+1}\log n 的算法。具体方式是构造出 H 的树分解,然后执行和 k-tree problem 类似的 DP 过程。不过同样因为 not practical,所以不过多介绍。

这里,我还想介绍一种时间复杂度 2^{O(k)}n^{\omega}\log n 的,判定 k 元环存在性的算法。

4.2 k 元环问题的解法

首先,我们可以将上述问题转化为:对任意一对起点 u,v,判断是否存在一条点数为 k 的简单路径,它的两个端点分别是 u,v。如果 u,v 满足上述条件且 (u,v)\in E,那么我们就找到了一个 k 元环。

通过枚举起点 s,然后套用 k-path problem 的解法,不难得到一个 2^{O(k)}nm\log n 的解法。

为了得到 2^{O(k)}n^{\omega} \log n 的算法,我们需要用到分治的思想。

solve(S) 代表考虑点集 V_0=\{v|f(v)\in S\} 的生成子图,对任意 u,v\in V_0,求出是否存在长度为 |S| 的路径,它的两个端点分别为 u,v

容易发现,solve(\{0,1\dots,k-1\}) 即为我们所求。

+ 将 $S$ 划分成两个集合 $S_1$ 和 $S_2=S\backslash S_1$,其中 $S_1=\left\lfloor\frac{|S|}{2}\right\rfloor$。递归求解 $S_1$ 和 $S_2$ 的答案。 + 假设已经求出了 $S_1$ 和 $S_2$ 的答案,分别用 $n\times n$ 的布尔矩阵 $A_1$ 和 $A_2$ 表示。 找出所有的边 $(u,v)\in E$,满足 $f(u)\in S_1 \land f(v)\in S_2$($\land$ 表示逻辑且),用邻接矩阵 $B$ 表示。 令 $C=A_1\times B\times A_2$,那么 $C_{u,v}=1$ 表示:存在路径 $v_1=u,v_2,\dots ,v_{|S|}=v$,且 $$f(v_i)\in S_1,\forall i\in \{1,2,\dots,\left\lfloor\dfrac{|S|}{2}\right\rfloor\}\land f(v_i)\in S_2,\forall i\in \{\left\lfloor\dfrac{|S|}{2}\right\rfloor+1,\dots,|S|\}$$ + 对于所有可能的 $S_1$,将求出的 $C$ 或起来,就得到了点集 $S$ 的答案。 每次合并的时间复杂度为 $\binom{|S|}{\frac{|S|}{2}}n^{\omega}$,solve 被调用的次数在 $2^k$ 级别,所以最终复杂度就是 $2^{O(k)}n^{\omega}\log n$。 实际上,上述算法可以推广到模式图 $H$ 是任意广义串并联图的情况,这里不讲,因为作者本人也不会。 ## 5. 染色技术在 OI 中的应用 有什么好玩的题欢迎评论/私信我添加。 >**例 5.1** [[CSP-S 2022] 假期计划](https://www.luogu.com.cn/problem/P8817) 稍加转化即可变成 `k-path problem`,实现常数好+卡时可以通过。 说句闲话:和正解相比,这种解法唯一的好处可能就是,扩展性比较强? > **例 5.2** [[THUSCH2017] 巧克力](https://www.luogu.com.cn/problem/P7450) 对巧克力种类染色之后是一个类似斯坦纳树的 DP,最小化中位数可以二分答案,比较套路。 一些细节可以看我的[题解](https://www.luogu.com.cn/blog/LuoTianyi-QwQ/p7450-qiao-ke-li)。 >**例 5.3** [「2020-2021 集训队作业」Storm](https://loj.ac/p/3400) 发现这是一个类似费用匹配的模型,但是不太容易直接用网络流模型解决。 受到数据范围的启发,考虑将每个点黑白染色,只保留端点不同色的边。接下来就可以用费用流处理。 尝试分析一下这个解法的正确性 & 运行次数。 发现选的边形成环一定不优,所以最终选出的边集一定构成森林。 进一步可以发现,如果边集中存在长度 $\ge 3$ 的链,那么去掉中间一条边会让答案变得更优。所以最终选出的边构成菊花图森林。 关于算法正确率,对于每个联通块,必须满足周围的点颜色和中间那个点不同,总的概率为 $2^{-K}$。 所以最终复杂度为 $O(-2^{K}flow()\log \epsilon)$。 > **例 5.4(分组问题)** 有 $n$ 个人,他们之间有 $m$ 对朋友关系。你要选出 $3k$ 个人参加 ACM 比赛,并将他们分成 $k$ 组,每组 $3$ 个人,满足同一组中的人两两之间都是朋友。判断是否存在合法的分组方案。 用 $3k$ 种颜色染色之后,用状压 DP 和枚举三元环的技巧可以做到 $O(2^{O(k)}n^{\omega}\log n)$/$O(2^{O(k)}m\sqrt{m}\log n)$ 的复杂度,虽然常数巨大。 ## 6. 总结 经过上面的讨论,我们可以发现:在解决子图同构问题方面,对于模式图 $H$ 的树宽度比较小(例如树、环)的情况,染色技术能起到比较好的优化时间复杂度的作用。 然而,也有一些子图同构问题的子问题是染色技术难以解决的:例如判断图 $G$ 中是否存在大小为 $k$ 的团/独立集(补图转化后变成团)。 ## 7. 鸣谢&参考资料 ### 7.1 鸣谢 感谢上海交通大学的陈翌佳教授,没有他本人就不会了解到这项技术。 感谢本文使用的例题&参考资料的作者。 ### 7.2 参考资料 1. N. Alon, R. Yuster, and U. Zwick. Color-coding. *J. ACM*, 42(4): 844-856, 1995. 2. [oi wiki/杂项/随机化技巧](https://oi-wiki.org/misc/rand-technique/#%E7%94%A8%E9%9A%8F%E6%9C%BA%E9%9B%86%E5%90%88%E8%A6%86%E7%9B%96%E7%9B%AE%E6%A0%87%E5%85%83%E7%B4%A0)