Loading docs/graph/chord.md +16 −16 Original line number Diff line number Diff line 弦图是一种特殊的图,很多在一般图上的 NP 问题在弦图上都有优秀的线性时间复杂度算法。 ### 一些定义与性质 ## 一些定义与性质 **子图** :点集和边集均为原图点集和边集子集的图。 Loading Loading @@ -42,13 +42,13 @@ 证明:一个点数大于 $3$ 的环不是弦图,用以上定理即可。 ### 弦图的判定 ## 弦图的判定 #### 问题描述 ### 问题描述 给定一个无向图,判断其是否为弦图。 #### 点割集 ### 点割集 对于图 $G$ 上的两点 $u,v$ ,定义这两点间的 **点割集** 为满足删除这一集合后, $u,v$ 两点之间不连通。如果关于 $u,v$ 两点间的一个点割集的任意子集都不是点割集,则称这个点割集为 **极小点割集** 。 Loading @@ -68,7 +68,7 @@ 由此,可证弦图中每个极小点割集中的两点都有边直接相连,故性质得证。 #### 单纯点 ### 单纯点 设 $N(x)$ 表示与点 $x$ 相邻的点集。若点集 $\{x\}+N(x)$ 的导出子图为一个团,则称点 $x$ 为单纯点。 Loading @@ -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\}$ 的导出子图中为单纯点。 Loading @@ -92,7 +92,7 @@ 必要性:假设有无向图存在结点数 $>3$ 的环且拥有完美消除序列,设在完美消除序列中出现的第一个环上的点为 $v$ ,设 $v$ 在环上与 $v_1,v_2$ 相连,则有完美消除序列的性质即单纯点的定义可得 $v_1,v_2$ 直接有边相连,矛盾。 #### 朴素算法 ### 朴素算法 每次找到一个 **单纯点** $v$ ,加入到完美消除序列中。 Loading @@ -102,7 +102,7 @@ 时间复杂度 $O(n^4)$ 。 #### MCS 算法 ### MCS 算法 **最大势算法** (Maximum Cardinality Search)是一种可以在 $O(n+m)$ 的时间复杂度内求出无向图的完美消除序列的方法。 Loading Loading @@ -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)$ 。 Loading @@ -211,7 +211,7 @@ else 至此, **弦图判定问题** 可以在 $O(n+m)$ 的时间复杂度内解决。 ### 弦图的极大团 ## 弦图的极大团 令 $N(x)$ 为满足与 $x$ 直接有边相连且在完美消除序列上的 $x$ 之后的序列。则弦图的极大团一定为 $\{x\}+N(x)$ 。 Loading Loading @@ -244,7 +244,7 @@ for (int i = 1; i <= n; i++) { } ``` ### 弦图的色数/弦图的团数 ## 弦图的色数/弦图的团数 一种构造方法:按完美消除序列从后往前依次给每个点染色,给每个点染上可以染的最小颜色。时间复杂度 $O(m+n)$ 。 Loading @@ -256,7 +256,7 @@ for (int i = 1; i <= n; i++) { for (int i = 1; i <= n; i++) ans = max(ans, deg[i] + 1); ``` ### 弦图的最大独立集/最小团覆盖 ## 弦图的最大独立集/最小团覆盖 最大独立集:完美消除序列从前往后,选择所有没有与已经选择的点有直接连边的点。 Loading @@ -273,7 +273,7 @@ for (int i = 1; i <= n; i++) } ``` ### 习题 ## 习题 [SP5446 FISHNET - Fishing Net](https://www.luogu.org/problem/SP5446) Loading @@ -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) Loading Loading
docs/graph/chord.md +16 −16 Original line number Diff line number Diff line 弦图是一种特殊的图,很多在一般图上的 NP 问题在弦图上都有优秀的线性时间复杂度算法。 ### 一些定义与性质 ## 一些定义与性质 **子图** :点集和边集均为原图点集和边集子集的图。 Loading Loading @@ -42,13 +42,13 @@ 证明:一个点数大于 $3$ 的环不是弦图,用以上定理即可。 ### 弦图的判定 ## 弦图的判定 #### 问题描述 ### 问题描述 给定一个无向图,判断其是否为弦图。 #### 点割集 ### 点割集 对于图 $G$ 上的两点 $u,v$ ,定义这两点间的 **点割集** 为满足删除这一集合后, $u,v$ 两点之间不连通。如果关于 $u,v$ 两点间的一个点割集的任意子集都不是点割集,则称这个点割集为 **极小点割集** 。 Loading @@ -68,7 +68,7 @@ 由此,可证弦图中每个极小点割集中的两点都有边直接相连,故性质得证。 #### 单纯点 ### 单纯点 设 $N(x)$ 表示与点 $x$ 相邻的点集。若点集 $\{x\}+N(x)$ 的导出子图为一个团,则称点 $x$ 为单纯点。 Loading @@ -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\}$ 的导出子图中为单纯点。 Loading @@ -92,7 +92,7 @@ 必要性:假设有无向图存在结点数 $>3$ 的环且拥有完美消除序列,设在完美消除序列中出现的第一个环上的点为 $v$ ,设 $v$ 在环上与 $v_1,v_2$ 相连,则有完美消除序列的性质即单纯点的定义可得 $v_1,v_2$ 直接有边相连,矛盾。 #### 朴素算法 ### 朴素算法 每次找到一个 **单纯点** $v$ ,加入到完美消除序列中。 Loading @@ -102,7 +102,7 @@ 时间复杂度 $O(n^4)$ 。 #### MCS 算法 ### MCS 算法 **最大势算法** (Maximum Cardinality Search)是一种可以在 $O(n+m)$ 的时间复杂度内求出无向图的完美消除序列的方法。 Loading Loading @@ -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)$ 。 Loading @@ -211,7 +211,7 @@ else 至此, **弦图判定问题** 可以在 $O(n+m)$ 的时间复杂度内解决。 ### 弦图的极大团 ## 弦图的极大团 令 $N(x)$ 为满足与 $x$ 直接有边相连且在完美消除序列上的 $x$ 之后的序列。则弦图的极大团一定为 $\{x\}+N(x)$ 。 Loading Loading @@ -244,7 +244,7 @@ for (int i = 1; i <= n; i++) { } ``` ### 弦图的色数/弦图的团数 ## 弦图的色数/弦图的团数 一种构造方法:按完美消除序列从后往前依次给每个点染色,给每个点染上可以染的最小颜色。时间复杂度 $O(m+n)$ 。 Loading @@ -256,7 +256,7 @@ for (int i = 1; i <= n; i++) { for (int i = 1; i <= n; i++) ans = max(ans, deg[i] + 1); ``` ### 弦图的最大独立集/最小团覆盖 ## 弦图的最大独立集/最小团覆盖 最大独立集:完美消除序列从前往后,选择所有没有与已经选择的点有直接连边的点。 Loading @@ -273,7 +273,7 @@ for (int i = 1; i <= n; i++) } ``` ### 习题 ## 习题 [SP5446 FISHNET - Fishing Net](https://www.luogu.org/problem/SP5446) Loading @@ -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) Loading