NPC问题:恰好覆盖问题是NP完全的
恰好覆盖定义:类似于集合的划分,互不相交子集的并集为全集
恰好覆盖问题:给定有穷集\(A=\{a_1,a_2...a_n \}\)和A的子集的集合\(W=\{S_1,...S_m \}\),问是否存在子集\(U\subset W\)使得U中的子集都是不相交的且它们的并集等于A?
例题3:恰好覆盖是NP完全的
显然 恰好覆盖$\in $NP 。
下证 \(SAT \in _p\)恰好覆盖
证明思路
任给变元\(x_1,...x_n\)的合取范式\(F=C_1\and C_2...\and C_n\),其中\(C_j = z_{j1}\or...z_{js_j}\) 。需要构造有穷集A和 A的子集的集合W ,使得F是可满足的当且仅当W含有A的恰好覆盖
采用构件设计法
用\(p_{jt}\)表示\(C_j\)中的文字\(z_{jt}\)
证明构造
对每一个变元\(x_i\),有两个子集\(T_i^T\)和\(T_i^F\)
- \(T_i^T\)包含\(\neg x_i\)以及\(\neg x_i\)在所有简单析取式中的出现
- \(T_i^F\)包含$ x_i\(以及\)x_i$在所有简单析取式中的出现
其他的子集中都不包含\(x_i\)。因此任何恰好覆盖U必须恰好包含\(T_i^T\)和\(T_i^F\)中的一个,这对应于对\(x_i\)的赋值。如果\(t(x_i)=1\),当且仅当U包含\(T_i^T\)。
对每一个\(C_j\),有\(s_j\)个子集:\(C_{jt}=\{C_j,p_{jt} \},1\leq t\leq s_j\)。
除此之外,每一个\(p_{jt}\)构成一个单元子集\(\{p_{jt} \}\)
综上,W包含下述子集:
- 单元子集\(\{p_{jt} \},1\le t \le s_j,1\le j\le m\)
- \(T_i^T = \{x_i,p_{jt} |z_{jt}=\neg x_i,1\le t\le s_j,1\le j\le m \}\)
- \(T_i^F = \{x_i,p_{jt} |z_{jt}= x_i,1\le t\le s_j,1\le j\le m \}\)
- \(C_{jt} = \{C_j,p_{jt} \},1\le t\le s_j,1\le j\le m\)
实例如下
构造正确性
需要证明 F是可满足的 \(\iff\) W含有A的恰好覆盖
设\(U\subset W\)是A的恰好覆盖,对每一个i(\(1\le i\le n\)),若\(T_i^T\in U\),则令\(t(x_i)=1\),否则\(T(x_i)=0\)。
对每一个j(\(1\le j\le m\)),必有一个\(C_{jt}=\{C_j,p_{jt} \}\in U\)
若\(T_i^T \in U\),则\(p_{jt}\notin T_i^T\),所以\(z_{jt}=x_i\),此时有\(t(x_i)=1\)
若\(T_i^F \in U\),则\(p_{jt}\notin T_i^F\),从而\(z_{jt}=\neg x_i\),此时有\(t(x_i)=0\)
理解过程
以上面的实例图为例,如果要恰好覆盖,首先必须包含\(C_j\)这类元素,这就对应了任意j必有一个\(C_{jt}\),这样就有了\(p_{jt}\)
同理,需要恰好覆盖,所以必须包含\(x_i\)这类元素,这就对应了任意i,必须有\(T_i^T\)或\(T_i^F\)
由于需要恰好覆盖,那就要求\(p_{jt}\)不会再次出现
- 若\(p_{jt}=x_i\),那么只能是\(T_i^T\)加入U中,取\(t(x_i)=1\)
- 若\(p_{jt}=\neg x_i\),那么只能是\(T_i^F\)加入U中,取\(t(x_i)= 0\)
只要证明这是成真赋值即可。
上述操作,保证了任意j,都有一个\(z_{jt}=1\),所以是成真赋值
反之,设F是可满足的,t是F的成真赋值。若\(t(x_i)=1\),则U包含\(T_i^T\);若\(t(x_i)=0\),则U包含\(T_i^F\)。由于t满足\(C_j\),所以必有一个\(z_{jt}\),使得\(t(x_{jt})=1\)。从而U中现有的子集中不包含\(p_{jt}\),所以可以把\(C_{jt}\)加入到U中。最后补齐所剩的\(p_{jt}\)即可。
显然这个构造可以在多项式时间内完成,所以 可满足性\(\le_p\)恰好覆盖

浙公网安备 33010602011771号