Unverified Commit 3599a1a3 authored by Shuhao Zhang's avatar Shuhao Zhang Committed by GitHub
Browse files

update heading level

parent 92273479
Loading
Loading
Loading
Loading
+16 −16
Original line number Diff line number Diff line
弦图是一种特殊的图,很多在一般图上的 NP 问题在弦图上都有优秀的线性时间复杂度算法。

### 一些定义与性质
## 一些定义与性质

 **子图** :点集和边集均为原图点集和边集子集的图。

@@ -42,13 +42,13 @@

证明:一个点数大于 $3$ 的环不是弦图,用以上定理即可。

### 弦图的判定
## 弦图的判定

#### 问题描述
### 问题描述

给定一个无向图,判断其是否为弦图。

#### 点割集
### 点割集

对于图 $G$ 上的两点 $u,v$ ,定义这两点间的 **点割集** 为满足删除这一集合后, $u,v$ 两点之间不连通。如果关于 $u,v$ 两点间的一个点割集的任意子集都不是点割集,则称这个点割集为 **极小点割集**

@@ -68,7 +68,7 @@

由此,可证弦图中每个极小点割集中的两点都有边直接相连,故性质得证。

#### 单纯点
### 单纯点

设 $N(x)$ 表示与点 $x$ 相邻的点集。若点集 $\{x\}+N(x)$ 的导出子图为一个团,则称点 $x$ 为单纯点。

@@ -82,7 +82,7 @@

由于每次将整个图分成若干个连通块证明,大小一定减小,且都满足性质,故归纳成立。

#### 完美消除序列
### 完美消除序列

令 $n=|V|$ ,完美消除序列 $v_1,v_2,\ldots ,v_n$ 为 $1,2,\ldots ,n$ 的一个排列,满足 $v_i$ 在 $\{v_i,v_{i+1},\ldots ,v_n\}$ 的导出子图中为单纯点。

@@ -92,7 +92,7 @@

必要性:假设有无向图存在结点数 $>3$ 的环且拥有完美消除序列,设在完美消除序列中出现的第一个环上的点为 $v$ ,设 $v$ 在环上与 $v_1,v_2$ 相连,则有完美消除序列的性质即单纯点的定义可得 $v_1,v_2$ 直接有边相连,矛盾。

#### 朴素算法
### 朴素算法

每次找到一个 **单纯点**  $v$ ,加入到完美消除序列中。

@@ -102,7 +102,7 @@

时间复杂度 $O(n^4)$ 。

#### MCS 算法
### MCS 算法

 **最大势算法** (Maximum Cardinality Search)是一种可以在 $O(n+m)$ 的时间复杂度内求出无向图的完美消除序列的方法。

@@ -178,13 +178,13 @@ while (cur) {

如果此时原图是弦图,此时求出的就是完美消除序列;但是由于原图可能不是弦图,此时求出的一定不是完美消除序列,所以问题转化为 **判断求出的序列是否是原图的完美消除序列**

#### 判断一个序列是否是完美消除序列
### 判断一个序列是否是完美消除序列

##### 朴素算法
#### 朴素算法

根据定义,依次判断完美消除序列 $v$ 上 $\{v_i,v_{i+1},\ldots ,v_n\}$ 中与 $v_i$ 相邻的点是否构成了一个团。时间复杂度 $O(nm)$ 。

##### 优化后的算法
#### 优化后的算法

根据完美消除序列的定义,设 $v_i$ 在 ${v_i,v_{i+1},\ldots , v_n}$ 中相邻的点从小到大为 $\{v_{c_1},v_{c_2},\ldots ,v_{c_k} \}$ ,则只需判断 $v_{c_1}$ 与其他点是否直接连通即可。时间复杂度 $O(n+m)$ 。

@@ -211,7 +211,7 @@ else

至此, **弦图判定问题** 可以在 $O(n+m)$ 的时间复杂度内解决。

### 弦图的极大团
## 弦图的极大团

令 $N(x)$ 为满足与 $x$ 直接有边相连且在完美消除序列上的 $x$ 之后的序列。则弦图的极大团一定为 $\{x\}+N(x)$ 。

@@ -244,7 +244,7 @@ for (int i = 1; i <= n; i++) {
}
```

### 弦图的色数/弦图的团数
## 弦图的色数/弦图的团数

一种构造方法:按完美消除序列从后往前依次给每个点染色,给每个点染上可以染的最小颜色。时间复杂度 $O(m+n)$ 。

@@ -256,7 +256,7 @@ for (int i = 1; i <= n; i++) {
for (int i = 1; i <= n; i++) ans = max(ans, deg[i] + 1);
```

### 弦图的最大独立集/最小团覆盖
## 弦图的最大独立集/最小团覆盖

最大独立集:完美消除序列从前往后,选择所有没有与已经选择的点有直接连边的点。

@@ -273,7 +273,7 @@ for (int i = 1; i <= n; i++)
  }
```

### 习题
## 习题

 [SP5446 FISHNET - Fishing Net](https://www.luogu.org/problem/SP5446) 

@@ -281,7 +281,7 @@ for (int i = 1; i <= n; i++)

 [P3852\[TJOI2007\]小朋友](https://www.luogu.org/problem/P3852) 

### 参考资料
## 参考资料

 [弦图相关](https://yhx-12243.github.io/OI-transit/memos/15.html)