NPC问题:顶点覆盖是NP完全的
只需证明 \(3SAT \le _p VC\)
证明思路
任给3SAT的一个实例I(I由变元\(x_1,...x_n\)的3元合取范式\(F=\and_{1\le j\le m} C_j\)构成)
需要构造一个VC的实例\(f(I)\)(由一个无向图\(G=<V,E>\)和非负整数K构成)
要求:3元合取范式F是可满足的 当且仅当 G有顶点数不超过K的顶点覆盖
证明构造
第一部分,构造两个顶点\(x_1\)和\(\overline x_i\),以及连接他们的边\((x_i,\overline x_i)\)
从而任意顶点覆盖,在\(x_1\)和\(\overline x_i\)之间必须选择一个进行覆盖
第二部分,表示F的m个简单析取式,对于每一个简单析取式\(C_j = z_{j1}\or z_{j2}\or z_{j3}\),构造三角形,三个顶点分别记为\([z'_{j1,1}],[z'_{j2,2}],[z'_{j3,3}]\)。
因为这三个点两两相连,构成了三角形,所以任何顶点覆盖必须在这三个顶点中取两个
从上面两部分看,第一部分一共n个点,至少取一个;第二部分一共3m个点,至少取2m个,所以V'至少有\(n+2m\)个顶点。令\(K=n+2m\)。
所以第三部分的选择要求是,3元合取式可满足\(\iff\)G有顶点数不超过\(n+2m\)的顶点覆盖
第三部分,连接\([z'_{jk,k}]\)和\(z'_{jk}\)。其中\(z'_{jk}\)定义如下
-
\(z_{jk}=x_i\rightarrow z'_{jk}=x_i\)
-
\(z_{jk}=\neg x_i\rightarrow z'_{jk}=\overline x_i\)
构造正确性
设t是F的成真赋值
对于每一个i,若\(t(x_i)=1\),则取顶点\(x_i\);若\(t(x_i)=0\),则取顶点\(\overline x_i\)。这样,这n个点覆盖了第一部分
对于每一个j(\(1\le j\le m\)),\(C_j\)中至少有一个文字\(z_{jk}=1\),第三部分中其引出的边对应的顶点在第一部分中已经被取
比如\(z_{jk}=x_i\),那么说明\(x_i=1\),第一部分已经取了;如果\(z_{jk}=\neg x_i\),那么连接的是\(\overline x_i\),\(z_{jk}=1\)意味着\(x_i=0\),即\(\overline x_i\)被取
选择剩余的两个顶点即可,这样n+2m个点符合顶点覆盖要求
反之,设\(V'\subset V\)是G的一个顶点覆盖,且\(|V'|\le K = n+2m\)
显然必然是n个属于第一部分,2m个属于第二部分(这是满足顶点覆盖的基本要求)
选择和上面相反的策略,将第二部分没有取的一个点,连接的如果是\(x_i\),则\(x_i=1\);否则\(x_i=0\)。此时三元组中必有至少一项为1,符合3SAT条件

浙公网安备 33010602011771号