尽管如此,弦图依旧强大
一些定义
最小染色:用最少的颜色给点染色使得所有边连接的两点颜色不同。
色数:最小染色的颜色数。
团数:最大团的点数。
弦:连接环中不相邻两点的边。
弦图:任意长度大于 \(3\) 的环都有一个弦的图称为弦图。
点割集:对于图 \(G\) 上的两点 \(u,v\),定义这两点间的点割集为满足删除这一集合后,\(u,v\) 两点之间不连通。
单纯点:若点 \(x\) 与他的所有相邻点的导出子图是一个团,则这个点是单纯点。
完美消除序列:令 \(n=|V|\),完美消除序列 \(v_1,v_2,\cdots ,v_n\) 为 \(1,2,\cdots ,n\) 的一个排列,满足 \(v_i\) 在 \(\{v_i,v_{i+1},\cdots ,v_n\}\) 的导出子图中为单纯点。
一些性质
性质一
团数 \(\le\) 色数。
证明:
直接对最大团染不同颜色即可。
推论一
在弦图中:团数 \(=\) 色数。
性质二
最大独立集数 \(\le\) 最小团覆盖数。
证明:
每个团中至多选择一个点。
推论二
在弦图中:最大独立集数 \(=\) 最小团覆盖数。
性质三
弦图的任意导出子图一定是弦图。
证明:
如果弦图有导出子图不是弦图,说明在这个导出子图上存在大于 \(3\) 的无弦环,那么原图也不是弦图,矛盾。
性质四
任何一个弦图都至少有一个单纯点,不是完全图的弦图至少有两个不相邻的单纯点。
性质五
一个无向图是弦图当且仅当其有一个完美消除序列。
求法
求出无向图的完美消除序列
最大势算法(MCS)是一种可以在 \(O(n+m)\) 的时间复杂度内求出无向图的完美消除序列的方法。
思路
逆序给结点编号,即按从 \(n\) 到 \(1\) 的顺序给点标号。
设 \(label_x\) 表示第 \(x\) 个点与多少个已经标号的点相邻。
每次选择 \(label\) 值最大的未标号结点进行标号即可。
时间复杂度:\(O(n+m)\)。
Code
inline void mcs() {
fro(i, 1, n) to[0].push_back(i);
int sum = 0;
pre(pos, n, 1) {
int x = 0, y;
while (!x) {
while (to[sum].empty() == 0 && !x) {
y = to[sum].back();
if (!rk[y] && lb[y] == sum) x = y;
to[sum].pop_back();
}
if(!x) sum--;
}
rk[x] = pos, id[pos] = x;
for (int i = head[x]; i; i = e[i].nxt)
lb[e[i].to]++, to[lb[e[i].to]].push_back(e[i].to), sum = max(sum, lb[e[i].to]);
}
}
此算法可以证明,若无向图为弦图,则求出的序列一定是完美消除序列。
同样,若求出的序列为完美消除序列,则无向图一定是弦图。
判断一个序列是否是完美消除序列
根据完美消除序列的定义,设 \(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)\)。
挑战 NPC
各种不可做的图论问题在弦图上通通可以线性计算。
弦图实在是太厉害了。
求极大团
令 \(N(x)\) 为满足与 \(x\) 相邻且在完美消除序列上的 \(x\) 之后的点集。
则弦图的极大团只有可能为为 \(\{x\}+N(x)\)。
求最大团
将所有的极大团取最大值即可。
也就是:\(\max_{i=1}^n lable_i+1\)。
求色数
由于色数 \(=\) 团数,所以可以直接求最大团得到色数。
若需要方案。
可以在完美消除序列上从后往前染色,每个点染能染的最小颜色即可。
求最大独立集
完美消除序列从前往后,选择所有没有与已经选择的点有直接连边的点。
求最小团覆盖
设最大独立集为 \(\{v_1,v_2,\ldots ,v_t\}\),则团的集合 \(\{\{v_1+N(v_1)\},\{v_2+N(v_2)\},\ldots ,\{v_t+N(v_t)\} \}\) 为图的最小团覆盖。