「烧情侣」
0 烧情侣
Problem 0(烧情侣) 给你一张
n 个点的无向图G ,初始时每个点上有无穷多对情侣。每一次操作你可以执行以下动作之一:
- 在任意顶点上放置一名团员,烧掉这个顶点上的所有情侣。
- 将一个团员从图中移除。
- 选择一个团员,将他移动到相邻的顶点上,并烧掉该顶点上的所有情侣。
每次操作后,情侣会以无限速度沿边占据所有可到达的顶点(情侣不可穿过团员)。问至少需要多少个团员,才能在有限次操作内烧掉所有情侣。
下面给出几个样例:
| 图类型 | 最小所需团员数 |
|---|---|
| 链 | |
| 环( |
|
| 完全图( |
|
| 菊花图( |
|
| 网格图( |
本题由 @tiger0134 出于 6 年前,这里对问题描述略有修改。这篇博客以这道题目为线索,聊一聊图论中一些有趣的结论。
我尽量给出了一些核心定理的证明与算法代码实现,但不保证完全正确和严谨。欢迎与我讨论。
1 图搜索简介
在聊真正的烧情侣之前,我们先介绍一下 Search Games(图搜索问题),这在图论中被更广泛的研究,可以将其看成是“情侣在边上”的几种情况。稍后我们就介绍它们与 Problem 0 的相关性。
还是给你一张图
这个任务的核心挑战在于一个严格的规则:重复污染 (Recontamination)。一条已经没有情侣的边,如果存在一条完全由未被团员守卫的点组成的路径,能通往任何一个仍被污染的区域,那么这条边会瞬间被再次污染。
我们的目标是在某个时刻,使图中所有边同时处于已清理状态。而我们最关心的问题是:要完成这个任务,最少需要多少名团员?这个最小值,就是图的搜索数 (search number)。
根据清理边的具体操作方式,我们定义了三种基本的游戏模型。
Problem 1.1(Edge Searching)
这是最原始的图搜索游戏。
定义: 在 edge searching 模型中,一条边
(u, v) 是通过一名团员从其一个端点u 滑动到另一个端点v 来完成清理的。为了在滑动过程中保护已清理的区域,起始点u 必须已被“守卫”——即u 上驻留有另一名团员,或者与u 相连的所有其他边均已清理。基本操作:
- 在任意顶点上放置一名新团员。
- 从任意顶点上移除一名团员。
- 将一名已在顶点上的团员沿一条边滑动到另一端。
Edge search number: 该模型下的最小团员数量记为
es(G) 。Problem 1.2(Node Searching)
Node searching 模型取消了“滑动”这一动态操作,规则更为静态。(注意:该模型中不存在“滑动”操作)
定义: 在 node searching 模型中,一条边
(u, v) 被清理的唯一方式是,其两个端点u 和v 被团员同时占据。基本操作:
- 在任意顶点上放置一名新团员。
- 从任意顶点上移除一名团员。 (注意:该模型中不存在“滑动”操作)
Node search number: 该模型下的最小团员数量记为
ns(G) 。Problem 1.3(Mixed Searching)
Mixed searching 是上述两种模型的自然推广,它赋予了团员更大的策略自由度。
定义: 在 mixed searching 模型中,一条边
(u, v) 的清理方式十分灵活,可以是以下任意一种:
- 通过一名团员从
u 滑动到v (同 edge search)。- 通过同时占据端点
u 和v (同 node search)。基本操作:
- 在任意顶点上放置一名新团员。
- 从任意顶点上移除一名团员。
- 将一名已在顶点上的团员沿一条边滑动到另一端。
Mixed search number: 该模型下的最小团员数量记为
ms(G) 。
为了确保你真的理解了上面三种图搜索的定义,可以看看下面图中的各个搜索数是不是和你算的一样:
2. “烧”顶点与“烧”边的联系
在上一节中,我们定义了三种“烧边上的情侣”的战术:edge searching(依赖滑动)、node searching(依赖占位)和 mixed searching(全都要)。一个自然的问题是:这三种战术的优劣如何?它们的搜索数之间有什么样的数量关系?
由定义,任何一个合法的 edge search 或 node search 策略,本身就是一个合法的 mixed search 策略。因此,我们有
一个稍进一步的观察是,在 mixed search 的每一步中,我们都可以以最多一个额外团员为代价,通过 edge search 或 node search 来模拟。这给出了以下结论:
Proposition 2.1
es(G) - 1 \le ms(G) \le es(G)\;\text{and}\;ns(G) - 1 \le ms(G) \le ns(G)
这说明,三种搜索数之间的差距非常小,最多只相差 1。所有的 4 种情况都在上一节的图中被列出。
但是有时候我们期望的不是这种不等关系,而是等价关系,或者说一种零成本的模拟。所以我们的下一个问题是,三种搜索问题之间是否可以通过构造性的方法进行转化(规约)?
我们定义
Theorem 2.2
es(G) = ms(G^e) 且ns(G) = ms(G^n)
Proof 这里只证
首先,显然有
对于另一个方向,我们分两步证明:
-
$G$ 上的边 $(u,v)$ 对应 $G^e$ 上的两条边 $(u,w)$ 和 $(w,v)$。我们将所有的 $(w,v)$ 收缩(contract),得到的新图 $H$ 与 $G$ 同构。$H$ 的每一个顶点 $v$ 都是通过将 $G^e$ 的一个顶点子集 $C_v$ 合并而得到的。给定一个 $G^e$ 的边搜索,我们通过以下规则将其转换为 $H$ 的边搜索:如果在第 $i$ 步,团员 $s$ 位于顶点 $u\in V(G^e)$,那么在新的搜索的第 $i$ 步,团员 $s$ 就位于顶点 $v\in V(H)$,其中 $u\in C_v$。这满足了我们的要求。 -
我们只要证明对于 $G^e$ 上的一个 mixed search 方案,它所有通过同时占据两端点来清理的边,都可以在不增加新的团员的情况下,通过滑动操作来清理(回顾 mixed search 定义了两种清理方式)。 具体来说,假设 mixed search 第 $i$ 步有一条边 $(u,v)$ 因为两个端点都被团员占据而被清理。由 $G^e$ 的定义,$u,v$ 中至少有一个是二度点,不妨设 $v$ 是二度点。那么我们在第 $i$ 步之后插入连续第两步:先将 $v$ 上的团员滑动到 $u$,再从 $u$ 滑动到 $v$。这样 $(u,v)$ 就以滑动的方式被清理了,并且不会有任何边发生重污染。
因此对
Remark 2.3 Theorem 2.2 意味着 edge search 和 node search 可以规约到 mixed search 上,但反过来可能并不容易。从定义上来看,mixed search 拥有更强的搜索能力。
现在我们回来考虑 Problem 0,即情侣在点上的原版烧情侣问题。也许到这里你已经注意到,这个问题与 mixed-search 是等价的。
Theorem 2.4 “烧情侣”(Problem 0)在简单图
G 上的答案为ms(G) 。
为了证明它,我们先证如下引理。
Lemma 2.5 对于简单图
G 上的一个搜索方案,在任何时刻,“烧情侣”被清理的点集为C 当且仅当 mixed search 被清理的边集为E_G(C) = \{(u,v)\in E(G)\mid u,v\in C\} ,即C 导出子图的边集。
Proof 假设在第
-
清理:
- 如果
v\in C_i ,那么C=C_i 和A=A_i 都不会变化。 - 如果
v\notin C_i ,考虑v 的邻居w\in C_i ,w 在第i 步一定有团员驻留,否则w 在第i 步会被重污染。如果w=u 那么(v,w) 在 mixed search 中因滑动而清理;否则它因v 和w 同时被占据而清理。因此这一步后,C = C_i \cup \{v\} ,A = A_i \cup \{(v,w)\in E(G)\mid w\in C_i\} = E_G(C_i\cup \{v\}) 。
- 如果
-
重污染:
- 如果“烧情侣”没有顶点可以被重污染,跳至 3。
- 否则,总可以选一个顶点
x\in C 将要被重污染,且它有一个邻居y\in V(G)\setminus C 。这意味着(x,y)\notin A ,因此 mixed-search 中,x 的所有邻边e 都会被(x,y) 重污染。C' = C - \{x\} ,A' = A - \{e\in E(G) \mid e\text{ is incident to } x\} = E_G(C'-\{x\}) 。重复 2。
-
此时“烧情侣”中已经没有顶点可以被重污染了。
假设 mixed search 中还有边可以被重污染,那么总可以选一条边
(u,v)\in A 将要被重污染,且v 上没有团员,有一条邻边(v,w)\in E(G)\setminus A 。这意味着v\in C, w\notin C ,因此v 会被w 重污染。这样导出了矛盾,所以此时 mixed search 中没有边可以被重污染。
这些事件结束后,
Proof of Theorem 2.4 由 Lemma 2.5 知,“烧情侣”清理完
Remark 2.6 注意 Theorem 2.4 在有重边的图上并不一定成立,比如 2 个点之间有 2 条边的图
G ,烧情侣的答案为 1,而ms(G)=2 。回顾证明过程,你会注意到有重边时“清理”这一步不一定保持 Lemma 2.5 成立。
3. 单调性(Monotonicity)
如果你花时间玩过一些样例的话,你可能会发现似乎总存在一种最优解(使用团员数最少的方案),可以在不发生重污染的情况下清理完所有情侣。我们称不发生重污染的方案为“单调”的。那么一个自然的问题是,是不是所有的搜索问题都存在单调最优解?
Definition 3.1(图搜索问题的单调性) 称一个图搜索问题具有单调性,如果对于所有图
G ,存在一个搜索方案使用的团员数\leq k ,则存在一个单调的搜索方案使用的团员数\leq k 。
不用多说就能感受到这个性质的重要性。如果它成立,一个搜索方案就可以用清理点(或者边)的线性长度序列来表示了。那么我们最关系的烧情侣问题,它具有单调性吗?似乎很符合直觉,但证明起来并不显然。在上一节中证明了前面定义的所有搜索问题都可以转化到 mixed searching 上,因此我们最好能直接证明 mixed searching 具有单调性。这一节我们就来证明它。
Theorem 3.2(Bienstock D, Seymour P. 1991) Mixed searching 具有单调性。
在开始之前,先来做一些记号与约定。
Notation 3.3
为了方便讨论,我们在这一节中认为每一步操作最多只会有一条新的边被清理(即使有多条边可以同时被清理,我们也将其分为多步),即 $|A_i-A_{i-1}| \le 1\text{ for } 1\le i \le n$。注意这里的 $A_i - A_{i-1}$ 是差集,即在 $A_i$ 中但不在 $A_{i-1}$ 中的边(不一定有 $A_i\supseteq A_{i-1}$),请务必不要和集合大小的差搞混。 设
X\subseteq E(G) 是一个边集,定义\delta(X) 为既是X 中某条边的端点,又是E(G)\setminus X 中某条边的端点的点集。注意到\delta(X) = \delta(E(G)\setminus X) 。此外,|\delta| 还满足 submodular inequality:|\delta(X\cup Y)| + |\delta(X\cap Y)| \leq |\delta(X)| + |\delta(Y)|, \quad \forall X,Y\subseteq E(G) 这是因为不等式左边每个被数到的点,都在右边被数到了至少同样多次。
- 定义图
G 一个 crusade 为E(G) 的一列子集(X_0,X_1,\ldots,X_n) ,满足X_0 = \emptyset ,X_n = E(G) ,且对于1\leq i\leq n ,|X_i-X_{i-1}| \leq 1 。我们称一个 cursade 使用少于k 个团员,如果对0\leq i\leq n 都有|\delta(X_i)| \le k 。
为什么要定义 crusade 呢?因为我们观察到,在描述 mixed search 方案时附带团员所在的点集有时显得有些冗余了。只有那些在
Proposition 3.4 如果
ms(G) \leq k ,那么存在一个使用\le k 个团员的 crusade。
Proof 我们证明对于任意一个使用
假设 mixed search 方案为
Remark 3.5 Proposition 3.4 的逆命题实际上是成立的,但证明并不显然。不过证明 crusade 的单调性是一件相对容易的事情。我们称一个 crusade
(X_0,X_1,\ldots,X_n) 是 progressive 的,如果X_0\subseteq X_1\subseteq \cdots \subseteq X_n ,且|X_i-X_{i-1}| = 1\text{ for } 1\leq i\leq n 。Lemma 3.6 如果图
G 有一个使用\le k 个团员的 crusade,那么也存在一个使用\le k 个团员的 progressive crusade。
Proof 选择一个使用
(1)
(2) 在满足 (1) 的前提下,
我们将证明
(3)
因为
(4)
因为否则,
(5)
因为根据
由 (4) 可得,
是一个使用
由 (3) 和 (5) 我们推断出
Lemma 3.7 设
G 是一张图,每个点的度数都\ge 2 。设(X_0,X_1,\dots,X_n) 是一个使用\le k 个团员的 progressive crusade,并且对于1\le i\le n ,X_i - X_{i-1} = \{e_i\} 。那么存在一个单调的 mixed search,它使用\le k 个团员,并且确保G 的边按e_1,e_2,\dots,e_n 的顺序被清理。
Proof 我们归纳地构造这个 mixed search。
假设对于
-
如果
|N \cup \delta(X_{j-1})| \le k ,我们可以将新的团员放置在e_j 的端点上,并宣告它被清理。 -
我们接下来假设
|N \cup \delta(X_{j-1})| > k 。那么(1)
N \not\subseteq \delta(X_{j-1}) 。如果
N \subseteq \delta(X_{j-1}) ,那么|N \cup \delta(X_{j-1})| \le |\delta(X_{j-1})| \le k ,这与假设矛盾。(2)
N - \delta(X_{j-1}) \subseteq \delta(X_j) 。这是因为对于任意
x\in N-\delta(X_{j-1}) ,x 度数\geq 2 ,它除了e_j 之外还与至少一条不在X_{j-1} 中的边e 关联,且e\notin X_j 。(3)
\delta(X_{j-1}) \not\subseteq \delta(X_j) 。如果
\delta(X_{j-1})\subseteq \delta(X_j) ,那么由 (2) 有N\cup \delta(X_{j-1}) = (N-\delta(X_{j-1}))\cup \delta(X_{j-1}) \subseteq \delta(X_j) ,则|N\cup \delta(X_{j-1})| \le |\delta(X_j)| \le k ,这与假设矛盾。由 (3),选择一个顶点
u \in \delta(X_{j-1}) - \delta(X_j) 。那么u \in N ,并且e_j 有端点u,v ,且u 除了e_j 之外,不与任何在E(G) - X_{j-1} 中的边(即有情侣的边)相关联。因此,我们可以通过将位于u 的团员沿着e_j 滑动到v 来清理e_j ,而不会发生重污染。\square
下面我们将前面几个命题和引理拼装起来,证明 mixed searching 的单调性。
Proof for Theorem 3.2 不妨假设
Corollary 3.8 烧情侣问题具有单调性。
这可以由 Lemma 2.5 和 Theorem 3.2 推出。
Remark 3.9 使用 Theorem 3.2 结合类似 Theorem 2.4 的证明方法,也可以得出 edge searching 和 node searching 具有单调性。这是 mixed search 灵活性的体现,其他问题的单调性都可以归约到它上面。
4. 一般图上的 O(2^n \cdot poly(n)) 算法和树上的 O(n) 算法
这一节讨论的都是 Problem 0(烧情侣)的算法。
单调性带给我们的一个直接的好处是,可以暴力枚举顶点被清理的顺序。容易得到一个基于动态规划的
Theorem 4.1 记用单调方案清理点集
S\subseteq V(G) 需要的最小团员数为f(S) ,则
其中
Proof 考虑枚举
注意
其中
-
|\partial(S)-\{v\}| \le f(S\setminus \{v\}) - 1 - 如果
|\partial(S\setminus \{v\})| \le f(S\setminus \{v\}) - 1 ,那么说明清理完S\setminus \{v\} 后,团员数比边界点数多,此时可以将空闲的团员移到v 上来清理。 - 如果
|\partial(S\setminus \{v\})| = f(S\setminus \{v\}) ,那么N_S(v) \not\subseteq \partial(S) 。取u\in N_S(v) - \partial(S) ,将点u 上的团员滑动到v 上来清理。
这样没有新增团员,因此用
f(S\setminus \{v\}) 来更新f(S) 。 - 如果
-
|\partial(S)-\{v\}| = f(S\setminus \{v\}) 此时
\partial(S)-\{v\} = \partial(S\setminus \{v\}) ,且N_S(v) \subseteq \partial(S) 。这意味着清理完S\setminus \{v\} 后所有团员都在边界点上(没有空闲的团员),且没有与v 相邻的团员。因此只能用f(S\setminus \{v\})+1 来更新f(S) 。
综上可得此时应该用
考虑到既然是题解,最好附上代码,下面给出这个算法的 C++ 实现。
Algorithm 4.2(一般图上的
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 20;
int N[MAXN]; // N[i] 表示 i 的邻居集合 mask
int f[1 << MAXN]; // f[S] 表示清理点集 S 需要的最小团员数
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
N[u] |= 1 << v;
N[v] |= 1 << u;
}
f[0] = 0; // 初值
for (int S = 1; S < (1 << n); S++) {
f[S] = n;
// 计算边界点集合 partial(S)
int partial = 0;
for (int v = 0; v < n; v++)
if (S & (1 << v) && (S & N[v]) != N[v])
partial |= 1 << v;
// 状态转移
for (int v = 0; v < n; v++)
if (S & (1 << v))
f[S] = min(f[S], max(f[S ^ (1 << v)], __builtin_popcount(partial & ~(1 << v)) + 1));
}
cout << f[(1 << n) - 1] << std::endl; // 输出答案
}
现在我们来讨论树上的烧情侣问题,目标是找出一个快速的多项式复杂度算法。为了方便,仍用
总体的思路是树形 DP,但在仅拥有单调性的情况下,设计一个能够快速合并子树的好的状态并不容易。实际上,我几年前在洛谷社区上写了一个比较 Trivial 的状态和转移,后来发现是错的。下面我们从一个关键性质(Theorem 4.4)的观察入手,给出一个正确、高效且巧妙的 DP 算法。
Lemma 4.3 设
T 是一棵树,k 是一个正整数。假设对于T 中的任意顶点v \in V(T) ,子图T \setminus \{v\} 最多只有两个ms=k 的连通分量,并且没有任何连通分量的ms\ge k+1 。那么,ms(T) \le k 。
Proof 设
如果
如果
此时这棵树长成如图所示的样子,我们可以用
如果
Theorem 4.4 对于任意树
T 和正整数k ,ms(T)\ge k+1 当且仅当T 中存在节点v 使得T\setminus \{v\} 至少有三个连通分量的ms\ge k 。
Proof (⇒) 设
(⇐)设
Corollary 4.5 对于任意树
T ,ms(T)\le \log_3(2|V(T)| + 1) 。
这可以由 Theorem 4.4 归纳得到。
Theorem 4.6(Takahashi et al. 1995) 对于任意树
T ,ms(T) 可以在线性时间内求出。
Proof 我们首先介绍路径向量(path vector),也就是树形 DP 的状态设计。
我们为任何以顶点
感性地讲,为什么要去维护路径向量呢?从 Theorem 4.4 可以看出,
当
设
假设一棵以 MERGE 过程根据 MERGE 过程的时间复杂度是 MERGE 过程被递归调用时,两个合并树中较大的 MERGE 过程合并路径向量直接 DP 的时间复杂度是
在图中所示的 LMERGE 过程中,我们可以通过使用路径向量链中的 LMERGE 过程的 1.2 或 2.2 处确定了 MERGE 过程的递归调用次数最多为 MERGE 过程在 LMERGE 过程在 DFS 过程通过使用 LMERGE 过程,根据以 MAIN 过程通过 DFS 过程获得的
令 LMERGE 过程从
注意到由
所定义的递推关系满足
Algorithm 4.7(树上的
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN = 1000005;
struct PathVector {
int p;
int c;
PathVector *n;
PathVector *b;
PathVector *n_star;
PathVector *b_star;
PathVector *btm;
PathVector(): p(1), c(0), n(nullptr), b(nullptr), n_star(this), b_star(this), btm(this) {}
void set(int p, int c, PathVector *n = nullptr, PathVector *s = nullptr) {
this->p = p;
this->c = c;
this->n = n;
if (!s) s = this;
if (n) {
n->b = this;
if (this->p == n->p + 1) {
this->b_star->n_star = n->n_star;
n->n_star->b_star = this->b_star;
} else {
this->b_star->n_star = this;
}
s->btm = n->btm;
} else {
this->b_star->n_star = this;
s->btm = this;
}
}
};
vector<int> G[MAXN]; // 邻接表
vector<PathVector*> pv_mem;
PathVector* merge(PathVector* P_s, PathVector* P_t) {
if (P_s->p > P_t->p) {
PathVector* P_sn = P_s->n_star;
if (P_s->c <= 2) P_s->set(P_s->p, P_s->c);
else if (P_sn->p < P_t->p) P_s->set(P_s->p + 1, 0);
else if (P_sn->p == P_t->p) {
if (P_sn->c >= 2 || P_t->c >= 2) P_s->set(P_s->p + 1, 0);
else P_sn->set(P_sn->p, P_sn->c + 1, nullptr, P_s);
} else if (P_sn->c <= 2) P_sn->set(P_sn->p, P_sn->c, nullptr, P_s);
else if (P_sn->c == 3) {
P_sn->set(P_sn->p, P_sn->c, merge(P_sn->n, P_t), P_s);
if (P_sn->n->p == P_sn->p) P_s->set(P_s->p + 1, 0);
}
return P_s;
} else if (P_s->p == P_t->p) {
if (P_s->c >= 2 || P_t->c >= 2) P_s->set(P_s->p + 1, 0);
else P_s->set(P_s->p, P_s->c + 1);
return P_s;
} else { // if P_s->p < P_t->p
PathVector* P_tn = P_t->n_star;
if (P_t->c <= 1) P_t->set(P_t->p, 1);
else if (P_t->c == 2) P_t->set(P_t->p, 3, P_s);
else if (P_s->p > P_tn->p) P_t->set(P_t->p + 1, 0);
else if (P_s->p == P_tn->p) {
if (P_s->c >= 2 || P_tn->c >= 2) P_t->set(P_t->p + 1, 0);
else P_tn->set(P_tn->p, P_s->c + 1, nullptr, P_t);
} else if (P_tn->c <= 1) P_tn->set(P_tn->p, 1, nullptr, P_t);
else if (P_tn->c == 2) P_tn->set(P_tn->p, 3, P_s, P_t);
else if (P_tn->c == 3) {
P_tn->set(P_tn->p, P_tn->c, merge(P_s, P_tn->n), P_t);
if (P_tn->n->p == P_tn->p) P_t->set(P_t->p + 1, 0);
}
return P_t;
}
}
PathVector* lmerge(PathVector* P_s, PathVector* P_t) {
if (P_s->p > P_t->p && P_s->c == 3) {
PathVector* P_prime = P_s->btm->b_star;
while (P_prime->p < P_t->p) P_prime = P_prime->b->b_star;
if (P_prime == P_s) P_s = merge(P_s, P_t);
else P_prime->b->set(P_prime->b->p, P_prime->b->c, merge(P_prime, P_t), P_s);
return P_s;
}
if (P_s->p < P_t->p && P_t->c == 3) {
PathVector* P_prime = P_t->btm->b_star;
while (P_prime->p < P_s->p) P_prime = P_prime->b->b_star;
if (P_prime == P_t) P_t = merge(P_s, P_t);
else P_prime->b->set(P_prime->b->p, P_prime->b->c, merge(P_s, P_prime), P_t);
return P_t;
}
return merge(P_s, P_t);
}
PathVector* DFS(int u, int f) {
PathVector* P_u = new PathVector();
pv_mem.push_back(P_u);
for (int v: G[u]) if (v != f) {
PathVector* P_v = DFS(v, u);
P_u = lmerge(P_u, P_v);
}
std::cout << "DFS(" << u << ") = " << P_u->p << std::endl;
return P_u;
}
int main() {
std::ios::sync_with_stdio(false);
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
cout << DFS(1, 0)->p << endl;
for (auto ptr: pv_mem) delete ptr;
pv_mem.clear();
return 0;
}
5. NP-Completeness
上一节中我们给出了一般图上的指数时间算法,以及树上的线性算法。那么对于一般图,我们有可能找到一个多项式时间算法吗?
很遗憾,事情并没有那么简单。这一节我们要证明,对于一般图,烧情侣问题是 NP-Complete 的。也就是说,如果你能找到这个问题的一个多项式时间解,那么所有 NP 问题都可以在多项式时间内求解,P = NP 就得证了。这看起来就很困难!
首先由第 3 节证明的单调性可知,所有的图搜索问题(包括烧情侣)都是 NP 问题,因为只要给出清理边(或者点)的顺序,容易在多项式时间内验证一个解。所以我们只需要证明烧情侣问题是 NP-hard 的,而证明方法是将一个已知的 NP-hard 问题 多项式时间归约 到烧情侣。归约的路径自然有很多,我们这里采用 Megiddo 等人 [3] 的方法,证明 Edge Searching 是 NP-hard 的。由于第 2 节中已证明 Edge Searching 可以归约到 Mixed Searching(Theorem 2.2),而 Mixed Searching 等价于烧情侣(Theorem 2.4),所以烧情侣也是 NP-hard 的。
Theorem 5.1(Megiddo et al. 1988) Edge Searching 是 NP-Complete 的。
我们通过将一个已知的 NP-complete 问题——等规模子集最小割 (MIN-CUT INTO EQUAL-SIZED SUBSETS)——归约到 Edge Searching 问题来证明其 NP-hardness。
Problem 5.2(等规模子集最小割)
- 问题: MIN-CUT INTO EQUAL-SIZED SUBSETS
- 实例: 一个图
G=(V,E) ,其中|V| 是偶数,以及一个正整数K 。- 提问: 是否存在一个将
V 划分为两个子集V_1 和V_2 的方案,使得|V_1|=|V_2|=\frac{1}{2}|V| ,并且连接V_1 和V_2 的边的数量(即|\{\{u,v\} \in E : u \in V_1, v \in V_2 \}| )不超过K ?
这是一个 NP-Complete 问题,但它的证明细节并不在我们的讨论范围内。感兴趣的同学可以参考 [5](P. 210 [ND17]),网上可以找到 PDF 版本。
下面为定理的证明引入核心工具:关于搜索完全图(Clique)的引理。证明的构造依赖于完全图
Lemma 5.3 假设在搜索
K_M (M \ge 4 ) 的过程中,在某个步骤t ,第一个顶点关联的所有边被完全清理。那么在该步骤中,必然有至少M-1 个团员位于K_M 上。
Proof 要想让一个顶点
Lemma 5.4 假设图
G 包含m 个顶点不相交的K_M 副本。那么在搜索G 的过程中,对于任意k (1 \le k \le m ),必然存在一个时间点,此时有k 个团(clique)中至少有一个已清理的顶点,而另外m-k 个团则完全没有,并且这k 个团中的某一个,包含M-1 个或更多的团员。
Proof 这是 Lemma 5.3 的直接推论。由于清理任何一个团的“启动成本”极高,在任何一个步骤中,最多只能“攻破”一个新的团。这为清理过程建立了一个自然的先后顺序。
Lemma 5.5 假设图
G 包含多个顶点不相交的K_M 副本。在搜索的某个时刻,设C_1 是一组已开始清理的团,而C_2 是一组完全未被清理的团。如果(u,v) 是G 的一条边,其中u 属于C_1 中的一个团,v 属于C_2 中的一个团,那么u 或v 上必须有一个团员。
Proof 这条边
回到定理的证明。
Proof of Theorem 5.1 从 MIN-CUT 实例
- 参数设定: 设原图
G 有n=|V| 个顶点,最大度为d 。选择两个巨大的整数N=6(d+K) 和M=n(n+2)N 。 -
构造新图 H:
- (i) 对于
G 中的每个顶点v_i \in V ,在H 中创建一个包含M 个顶点的完全图(团),记为C_i 。 - (ii) 额外创建一个“特殊的”
M -团,记为C_A 。 - (iii) 在任意两个团
C_i 和C_j (i\neq j ,包括C_A )之间添加nN 条边,此外在这些团之间添加额外边:- 如果
\{v_i, v_j\} 是G 中的一条边,则在团C_i 和C_j 之间再添加 3 条边。 - 对于任意
i ,在特殊团C_A 和普通团C_i 之间再添加N 条边。
- 如果
其中 (iii) 中加边的方式要保证每个团中的顶点关联至多一条到其他团的边。这一点是可以做到的,因为
M = n(n+2)N \ge n^2 N + N + 3d 。 - (i) 对于
- 构造目标搜索数 s:
s = (M+1) + \left(\frac{n}{2}\right)^2 nN + 3K.
接下来我们证明
方向一 (⇒): 如果
-
搜索策略: 按照顺序清理:先清理所有
V_1 对应的团,然后清理特殊团C_A ,最后清理所有V_2 对应的团。 -
普通团: 清理普通团
C_i 时,需要的团员数最多为(M+1) + \left(\frac{n}{2} - 1\right)\left(\frac{n}{2} + 1\right) nN + \left(\frac{n}{2} - 1\right) (N + 3d) \\ \le s - 3K - nN + \frac{n}{2}(N+N) < s. -
特殊团: 团员数量在清理特殊团
C_A 时达到峰值。此时,我们需要:-
- 守卫连接
V_1 中n/2 个团和V_2 中n/2 个团的边。根据 Lemma 5.5,这需要(\frac{n}{2})^2 nN 个团员。 - 守卫连接
V_1 和V_2 之间由割边诱导的额外边。割的大小为K' ,每条原边对应3条新边,需要3K' 个团员。
总共需要
(M+1) + (\frac{n}{2})^2 nN + 3K' 个团员。因为K' \le K ,这个数量不超过我们设定的s 。 -
方向二 (⇐): 如果
-
根据 Lemma 5.4,在搜索过程中,必然有一个时刻,恰好有
n/2 个普通团已开始清理,而另外n/2 个普通团完全未动。并且在此时,有一个团正被“攻破”(即上面有M-1 个团员)。 -
这个被“攻破”的团必须是特殊团
C_A 。为什么?如果被攻破的是一个普通团C_i ,由 Lemma 5.5 可知,需要的团员数最少为(M - 1) + \left(\frac{n}{2}\right)^2 nN + \frac{n}{2} N = s + \frac{n}{2} N - (3K + 2) > s, 矛盾。这个迫使任何最优策略都必须选择
C_A 作为“中转站”。 -
构造割: 在
C_A 被攻破的那个时刻,让V_1 是那些已开始清理的团对应的原图顶点集,V_2 是未清理的团对应的顶点集。我们自然地得到了一个等规模划分(V_1, V_2) 。 -
计算割的大小: 在这一刻,总共
s 个团员被分配到:-
- 守卫
V_1 和V_2 之间连接的边,至少需要(\frac{n}{2})^2 nN 个。 - 剩下的预算用于守卫
V_1 和V_2 之间由割边诱导的额外边。 - 从总预算
s 中减去固定开销:s - (M-1) - (\frac{n}{2})^2 nN = 3K+2 。这意味着用于守卫割边的预算最多为3K+2 。 - 由于每条原图中的割边对应
H 中的 3 条边,所以原图割的大小最多是\lfloor (3K+2)/3 \rfloor = K 。
-
综上所述我们已经证明了,当且仅当
Corollary 5.6 烧情侣问题是 NP-Complete 的。
Proof 由 Corollary 3.8 知烧情侣是 NP 问题。由 Theorem 2.2 和 Theorem 2.4 可知,Edge Searching 可以归约到烧情侣问题,因此烧情侣问题也是 NP-Complete 的。
6. 从搜索游戏到图的内在结构
在前面的章节中,我们已经对“烧情侣”这个看似简单的游戏有了深入的了解。我们不仅定义了它的三种战术变体——edge, node, 和 mixed searching——还通过一个巧妙的归约,证明了计算最优策略(即
这一节中,我们将从动态的搜索游戏(主要是 mixed searching,即“烧情侣”)出发,寻找它与图的静态内在结构之间的对偶关系。
Definition 6.1 (Pathwidth, pw) 一个图
G 的路径分解 (path-decomposition) 是一个由顶点子集组成的序列\mathcal{X} = (X_1, X_2, \dots, X_r) ,满足:
- 对于所有不同的
i, j ,都有X_i\not\subseteq X_j ;- 对任意边
(u,v)\in E(G) ,存在某个X_i 使得u,v\in X_i ;- 对所有
l,m,n 满足1\le l<m<n\le r ,都有X_l\cap X_n\subseteq X_m 。路径分解的宽度是
\max_i |X_i| - 1 。图G 的路径宽度pw(G) ,是其所有可能的路径分解中的最小宽度。Definition 6.2 (Proper-Path-Width, ppw) 一个路径分解
\mathcal{X} = (X_1, X_2, \dots, X_r) 被称为适度 (proper) 的,如果它满足
- 对所有
l,m,n 满足1\le l<m<n\le r ,都有|X_l\cap X_n| \le |X_m| - 2 。 图G 的适度路径宽度ppw(G) ,是其所有可能的适度路径分解中的最小宽度。Notation 6.3
- 称一个宽度为
k 的 (proper-)path-decomposition 为k -(proper-)path-decomposition。- 称一个
k -(proper-)path-decomposition(X_1, X_2, \dots, X_r) 为满(full)的,如果|X_i| = k+1(1\le i\le r) 且|X_j\cap X_{j+1}| = k(1\le j\le r-1) 。
下图展示了图
Takahashi 等人的工作揭示了 Mixed Searching 与 Proper-Path-Width 之间令人惊叹的等价关系。我们先给出三个引理,其中第二个引理的技术性比较强,篇幅所限不给出完整证明。
Lemma 6.4 (1)
\mathcal{X} 满足 Definition 6.1 中的条件 4 当且仅当G 中的每个顶点出现在连续的X_i 中。(2) 一个 path-decomposition
(X_1, X_2, \dots, X_r) 是 proper 的(即满足 Definition 6.2 中的条件 5)当且仅当|X_{i-1}\cap X_{i+1}|\le |X_i|-2 。
这个引理是基于定义的一些简单推导。
Lemma 6.5 如果一个图
G 有一个k -path-decomposition\mathcal{X}=(X_1, X_2, \dots, X_r) 满足:|X_{i-1}\cap X_{i+1}| \le k-1 \quad (1 < i < r) \tag{*} 那么
G 就有一个 fullk -proper-path-decomposition。
证明的大致思路是,选择满足
Lemma 6.6 如果图
G 满足ppw(G) = k ,那么G 有一个 fullk -proper-path-decomposition。
这是 Lemma 6.5 的直接推论。
Theorem 6.7 对于任意简单图
G ,ms(G) = ppw(G) 。
Proof 首先证明
假设
如果
-
Step 1: 令
v_1 是X_1 \cap X_2 中的一个顶点。将k 个团员放置在X_1 - \{v_1\} 的顶点上。 -
Step 2: 令
u_1 是X_1 - X_2 中的一个顶点。如果(u_1, v_1) \in E(G) ,将u_1 上的团员朝向v_1 滑动并放置在v_1 上。否则,从u_1 删除一个团员并在v_1 上放置一个团员。令i=1 。 -
Step 3: 当
i \le r-2 时,重复执行步骤3。令i = i+1 。令u_i 是X_i - X_{i+1} 中的一个顶点,令v_i 是X_i - X_{i-1} 中的一个顶点。如果(u_i, v_i) \in E(G) ,将u_i 上的团员朝向v_i 滑动并放置在v_i 上。否则,从u_i 删除一个团员并在v_i 上放置一个团员。 -
Step 4: 令
u_r 是X_{r-1} \cap X_r 中的一个顶点,令v_r 是X_r - X_{r-1} 中的一个顶点。如果(u_r, v_r) \in E(G) ,将u_r 上的团员朝向v_r 滑动并放置在v_r 上。否则,从u_r 删除一个团员并在v_r 上放置一个团员。
根据 full k-proper-path-decomposition 的定义,顶点
一条两个端点都在
假设连接
因此,上述过程确实是一个使用了至多
接下来证明
假设我们有一个使用
令
令
如果
所以,
这个深刻的联系并非孤例。事实上,更早的研究已经揭示了 Node Searching 与标准路径宽度之间的关系。
Theorem 6.8 (Kirousis & Papadimitriou, 1986; Möhring, 1990) 对于任意图
G ,ns(G) = pw(G) + 1 。
还有一些其他与搜索数 / path-width 等价的问题,例如:
Problem 6.9 我们称图
G 的一个线性布局(linear layout)是1 到|V(G)| 的一个排列L ,定义V_{L}=\{x\in V(G) \mid \exists y\text{ s.t. } (x,y)\in E(G), L(x) \le i, L(y) > i\} 。G 关于L 的顶点分离数(vertex separation)为vs_L(G)=\max_{i=1}^{|V(G)|} |V_{L_i}| 。图G 的顶点分离数vs(G)=\min_{L} vs_L(G) 。Theorem 6.10(Kinnersley, 1992) 对于任意图
G ,vs(G) = pw(G) 。
Definition 6.11 图
G 的一个 k-clique 是G 的一个有k 个顶点的完全子图。对于正整数k ,我们递归地定义 k-tree:
- 给定一个
n 个点的 k-treeQ (n\ge k ),新增一个与Q 中某个 k-clique 相邻节点得到的n+1 个节点的图是 k-tree。 一棵 k-treeQ 一条 k-path,如果|V(Q)|\le k+1 ,或者Q 恰好有两个k 度点。 我们称 k-path 的子图为 partial k-path。Remark 6.12 1-path 是链;1-tree 是树。
Theorem 6.13 (Takahashi et al., 1995) 对于任意正整数
k ,一个简单图G 的ppw(G) \le k 当且仅当G 是一个 partial k-path。
(⇒) 假设
- 令
v_1 是X_1 \cap X_2 中的一个顶点。定义Q_1 为在顶点集X_1 - \{v_1\} 上的 h-完全图。 - 定义
Q_2 是通过将顶点v_1 以及连接v_1 和X_1 - \{v_1\} 中所有顶点的边加入到Q_1 中而得到的 h-path。 - 给定
Q_i (2 \le i \le r ),定义Q_{i+1} 是通过将顶点v_i \in X_i - X_{i-1} 以及连接v_i 和X_i - \{v_i\} 中所有顶点的边加入到Q_i 中而得到的 h-path。 - 定义
H=Q_{r+1} 。
由定义可以验证
(⇐) 反过来,不妨假设
- 记
Q_1 = R_1 为一个在h 个顶点上的完全图。 - 给定
Q_i 和R_i (1 \le i \le n-h ):记Q_{i+1} 是通过加入一个不在Q_i 中的顶点v_i 并连接v_i 和R_i 中所有顶点而得到的 h-path,并令R_{i+1} 是Q_{i+1} 中包含v_i 的一个 h-clique。 - 定义
H = Q_{n-h+1} 。
我们定义
因此,我们有
根据
Corollary 6.14 对于任意正整数
k ,如果一个简单图G 的ppw(G) \le k ,则E(G) \le k |V(G)| 。
7. Treewidth 有界图的线性算法
在第 5 章中,我们证明了烧情侣问题在一般图上是 NP-hard 的;第 4 章给出了树上的一个线性算法。这种树上可以做但图上做不了的问题其实很常见。现在的问题是,这个问题还在哪些图类上有多项式算法?
一个自然的想法就是,如果一个图长得很像树,那么我们也许可以用类似树上的算法来解决。比如在基环树上的题可以拆成环上的多棵树来求解,仙人掌上的题可以考虑用它圆方树求解。这一节我们来讨论一个相对先进的方法,可以某种意义上定量地衡量一个图有多“像”一棵树;对于那些很像树的图,提出一个烧情侣问题的快速算法。
上一节最后讨论了 k-path 与 k-tree,Theorem 6.13 告诉我们 partial k-path 就是
Definition 7.1 图
G 的一个树分解(tree decomposition)是一个二元组(\{X_i\mid i\in I\}, T=(I, F)) ,其中X_i\subseteq V(G) 且T 是一棵以I 为顶点集的树,满足
- 对任意边
(u,v)\in E(G) ,存在某个X_i 使得u,v\in X_i ;- 对所有
i,j,k\in I ,如果j 在T 上i 和k 之间的路径上,则X_i\cap X_j\subseteq V 。树分解的宽度是
\max_{i\in I} |X_i| - 1 。图G 的 treewidth 是所有可能的树分解的宽度中的最小值,记作tw(G) 。
这里定义的 treewidth 就是我们用来衡量一个图有多“像”一棵树的量,同时类似 Theorem 6.11 也可以证明图
我们的思路是,对于 treewidth 有界的图,先求出它的树分解,然后在分解树上 DP 来解决烧情侣问题。而求一个 partial k-tree 的树分解是一个被广泛研究的问题,经过学术界一段时间的研究和改进,下面是一个里程碑式的工作。
Theorem 7.2(Bodlaender H L. 1993) 存在复杂度
O(2^{k^2}n) 的算法,要么求出图G 宽度\le k 的 tree decomposition,要么报告tw(G) > k 。
这意味着如果
我们定义一个树分解
- 如果一个节点
i 有两个儿子j,k ,则X_i=X_j=X_k ; - 如果一个节点
i 只有一个儿子j ,则X_i 与X_j 恰有差一个元素(X_i 比X_j 多或者少一个元素)。
Lemma 7.3 如果图
G 满足tw(G)=k ,则有一个宽度为k 的好树分解。此外,当给定一个图G 的树宽为k 的树分解时,我们可以在线性时间内构造出一个该图G 的树宽为k 的好树分解。
这个构造好树分解的算法就像用若干两个插座的插排来接用电器。如果原树分解的节点
现在考虑一个好树分解
如果
定义一张
- 起始 (Start):给定一个
(\le l + 1) -边界图(H=(X, F), X) ,其中|X|\le l+1 。 - 遗忘 (Forget):给定一个
(\le l + 1) -边界图(H, X) ,取一个顶点v\in X ,然后得到(\le l + 1) -边界图(H, X - \{v\}) 。 - 引入 (Introduce):给定一个
(\le l + 1) -边界图(H=(W, F), X) ,其中|X|\le l ,取一个顶点v\notin W ,一个子集X'\subseteq X ,然后得到(\le l + 1) -边界图(H'=(W\cup\{v\}, F\cup\{(v, w)\mid w\in X'\}), X\cup\{v\}) 。 - 连接 (Join):给定两个
(\le l + 1) -边界图(H_1=(V_1, F_1), X) ,(H_2=(V_2, F_2), X) ,其中V_1\cap V_2=X ,取(H=(V_1\cup V_2, F_1\cup F_2), X) 。
Theorem 7.4 存在线性时间算法,可以判定一个 partial k-tree
G 是否满足ppw(G) \le k 。
由于博主写这篇文章时间有限,暂时无法给出这个定理的完整证明和实现代码 TAT,这里只说一下算法的大致思路(比较感性)。有机会我会补全这一部分。感兴趣的同学可以参考 [7],介绍的是一个求 pathwidth 的算法。
设
我们先对 Join 操作进行分析。如果
所以我们只维护 proper k-path decomposition 的特征。对于
Forget 和 Introduce 操作都要比 Join 操作简单,而 Start 操作可以在与
Theorem 7.5 在 partial k-tree 上(
k 为常数),烧情侣问题有线性算法。
之前我们证明过对于简单图,烧情侣的答案等于 proper-path-width。我们可以直接枚举
这种应对 treewidth 有界的图,在树分解上 DP 是一种构造算法的范式,最大独立集 / 最小斯坦纳树等经典的 NPC 问题都可以在线性时间内解决。
8. 参考文献
[1] Takahashi A, Ueno S, Kajitani Y. Mixed searching and proper-path-width[J]. Theoretical Computer Science, 1995, 137(2): 253-268.
[2] Bienstock D, Seymour P. Monotonicity in graph searching[J]. Journal of Algorithms, 1991, 12(2): 239-245.
[3] Megiddo N, Hakimi S L, Garey M R, et al. The complexity of searching a graph[J]. Journal of the ACM (JACM), 1988, 35(1): 18-44.
[4] Takahashi A, Ueno S, Kajitani Y. Minimal acyclic forbidden minors for the family of graphs with bounded path-width[J]. Discrete Mathematics, 1994, 127(1-3): 293-304.
[5] DS G M R J. Computers and intractability: a guide to the theory of NP-completeness[J]. San Franciso WH Freeman and co, 1979.
[6] Kinnersley N G. The vertex separation number of a graph equals its path-width[J]. Information Processing Letters, 1992, 42(6): 345-350.
[7] Bodlaender H L, Kloks T. Better algorithms for the pathwidth and treewidth of graphs[C]//International Colloquium on Automata, Languages, and Programming. Berlin, Heidelberg: Springer Berlin Heidelberg, 1991: 544-555.
[8] Bodlaender H L. A linear time algorithm for finding tree-decompositions of small treewidth[C]//Proceedings of the twenty-fifth annual ACM symposium on Theory of computing. 1993: 226-234.