k 染色问题、二分图完美匹配数、k 路径问题

三个知名 \(\text{NP}\) 问题:「\(\rm{k}\)-染色问题」「二分图完美匹配计数」「\(\rm{k}\)-路径问题」。

虽然目前还没有多项式算法,但是三者都存在 \(O(2^n\rm{poly}(n))\) 的指数算法,它们都基于一个容斥公式的应用。

\(U\) 为全集,对于 \(i\in[n],S_i\sube U\),有

\[\large{ |\bigcap_{i\in[n]}S_i|=\sum_{X\sube [n]}(-1)^{|X|}|\bigcap_{i\in X}\overline{S_i}|} \]


k 染色问题

给定一个 \(n\) 的点的无向图和正整数 \(k\),判定是否存在一种方案,将每个点染成 \(k\) 种颜色中的一个,使得任意两个之间有边相连的点颜色不同。

\(S\) 为所有独立集组 \((I_1,I_2,...,I_k)\) 组成的集合,\(I_j\sube V\) 是一个独立集,设 \(A_i\)\(i\) 在至少一个独立集中出现的组的集合,\(A_i\sube S\)

于是存在方案 \(\iff |\bigcap_{i\in V}A_i|>0\)

\[\begin{align} |\bigcap_{i\in V}A_i|&=\sum_{X\sube V}(-1)^{|X|}|\bigcap_{i\in X}\overline{A_i}|\\ &=\sum_{X\sube V}(-1)^{|X|}\beta(V\backslash X)^k \end{align} \]

其中 \(\beta(S)\) 为点集 \(S\) 中的独立集数量,设 \(N(v)\)\(v\) 的邻居集合,则对于 \(v\in S\)

\[\beta(S)=\beta(S\backslash\{v\})+\beta(S\backslash(\{v\}\cup N(v))) \]

于是可以 \(O(2^n)\) 预处理 \(\beta(S)\),进而 \(O(2^n \log k)\) 得到 \(|\bigcap_{i\in V}A_i|\),判断是否有解。


二分图完美匹配数

给定一张左右部图均为 \(n\) 个点的二分图,求完美匹配数量。

\(U\) 为所有左匹配的集合,即所有左部点连出一个匹配,但是不需要满足匹配中的右部点不重不漏,设 \(A_v\) 为有右部点 \(v\) 出现的左匹配的集合。所求即

\[\begin{align} |\bigcap_{v\in R}A_v| &= \sum_{X\sube R}(-1)^{|X|}|\bigcap_{i\in X}\overline{A_v}| \\ &= \sum_{X\sube R}(-1)^{|X|}\prod_{u\in L}(\text{number of edges from u to R\\X}) \end{align} \]

于是可以做到 \(O(n2^n)\)


k 路径问题

给定一张 \(n\) 个点的有向图,判定是否存在长度为 \(k\) 的简单路径。

对于每条边 \((u,v)\in E\),有变量 \(x_{u,v}\),对于每个点 \(i\in V,j\in [k]\),有变量 \(y_{i,j}\)

考虑构造 \(\!\!\!\!\mod\!2\) 数域下的多项式 \(P(x,y)\),使得 \(P(x,y)\neq 0\iff\) 存在长度为 \(k\) 的简单路径。设 \(W\) 为图上任意一条长度为 \(k\) 的路径 \(v_1,v_2,...,v_k\)

\[P(x,y)=\sum_{W}\sum_{\text{bijection }l:\;[k]\rightarrow[k]}\prod_{i=1}^{k-1}x_{v_i,v_{i+1}}\prod_{i=1}^ky_{v_i,l(i)} \]

若一条路径 \(W\) 存在重复节点,设 \(v_i=v_j\),则对于任意 \([k]\rightarrow[k]\) 的双射 \(l\),交换 \(l(i)\)\(l(j)\) 可以得到 \(l'\)\(l\)\(l'\) 权值相同且两两配对,因此 \(W\) 的权值是偶数,在 \(\!\!\!\mod\!2\) 意义下为 \(0\) 。反之非零。

\(m_{W,l}(x,y)=\prod_{i=1}^{k-1}x_{v_i,v_{i+1}}\prod_{i=1}^ky_{v_i,l(i)}\)。设 \(S\) 是所有 \([k]\rightarrow [k]\) 映射的集合,\(A_i\)\(i\) 存在于被映射集合中的集合,\(A_i\sube S\) 。设 \(w(X)=\sum_{l\in X}m_{W,l}(x,y)\)

\[\begin{align} P(x,y)&=\sum_{W}\sum_{\text{bijection }l:\;[k]\rightarrow[k]}m_{W,l}(x,y)\\ &= \sum_{W}w(\bigcap_{i\in[k]}A_i)\\ &= \sum_{W}\sum_{X\sube [k]}(-1)^{|X|}w(\bigcap_{i\in X}\overline{A_i}) \\ &= \sum_{X\sube [k]}\sum_W \sum_{\text{map }l:\;[k]\rightarrow [k]\backslash X}m_{W,l}(x,y) \end{align} \]

由于是 \(\!\!\!\!\mod 2\) 意义下的数域,因此 \((-1)^{|X|}\) 可以换成 \(1\)。设

\[P_X(x,y)=\sum_W\sum_{\text{map }l:\;[k]\rightarrow [k]\backslash X}\prod_{i=1}^{k-1}x_{v_i,v_{i+1}}\prod_{i=1}^ky_{v_i,l(i)} \]

\(dp(u,l)\) 表示所有从 \(u\) 开始,长度为 \(l\) 的路径的权值和,则

\[dp(u,1)=\sum_{i\in[k]\backslash X}y_{u,i}\\ dp(u,l)=(\sum_{i\in[k]\backslash X}y_{u,i})\sum_{v\in N(u)}x_{u,v}\cdot dp(v,l-1) \]

于是可以 \(O(n^2k)\) 动态规划得到 \(P_X(x,y)=\sum_{u\in V}dp(u,k)\)

所求 \(P(x,y)=\sum_{x\sube [k]}P_X(x,y)\) 可以 \(O(2^kn^2k)\) 计算得到。

于是随机期望 \(O(1)\)\(x_{i,j}\)\(y_{i,j}\) 的值,检查 \(P(x,y)\) 的值是否非零即可,总复杂度 \(O(2^kn^2k)\)


参考:Coping with Intractability CMU, Fall 2019 Lecture #7: Inclusion-Exclusion

posted @ 2022-11-02 15:41  Neal_lee  阅读(697)  评论(0编辑  收藏  举报