三个知名 \(\text{NP}\) 问题:「\(\rm{k}\)-染色问题」「二分图完美匹配计数」「\(\rm{k}\)-路径问题」。
虽然目前还没有多项式算法,但是三者都存在 \(O(2^n\rm{poly}(n))\) 的指数算法,它们都基于一个容斥公式的应用。
设 \(U\) 为全集,对于 \(i\in[n],S_i\sube U\),有
\[\normalsize{ |\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]}w_{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} \]设
\[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
标签:二分,染色,sum,backslash,问题,sube,bigcap,text,prod From: https://www.cnblogs.com/Neal-lee/p/16851228.html