《浅谈信息学竞赛中的弦图问题》 - 学习笔记
3 基础知识
3.1 弦图的点割集
读者自证不难。
3.2 弦图的单纯点
归纳证明。任取两个没有边的点,取出它们的极小点割集 \(A\) ,然后分成 \(V_1,V_2\) 。那么 \(V_1\cup A,V_2\cup A\) 的导出子图中都存在两个不相邻的单纯点,且至少一个不在 \(A\) 中,且两边没有连边,于是证毕。
3.3 弦图的完美消除序列
由于单纯点总是存在,所以完美消除序列也肯定存在。然后也很容易证明弦图和存在完美消除序列等价。
然后是最大势算法。注意这个算法求出的序列反过来才是完美消除序列。
(大概思路就是考虑 \(v_0\) 对 \(v_1\) 而非 \(v_k\) 有贡献,所以就可以拎出一个新的点,且使得 \(v_k\) 增大。)
3.4 弦图的判定
直接尝试造一个完美消除序列即可。
3.5 弦图的极大团
显然极大团都是某些 \(C(i)\) ,所以只需要对每个 \(C(i)\) 判断它是否有被包含。
容易发现只需要对每个 \(i\) ,判一下是否有 \(|C(i)|=|C(\min C(i)\backslash \{i\})|+1\) 即可。如果有那就把 \(\min C(i)\backslash \{i\}\) ban 掉。
3.6 弦图的色数/团数
贪心。
3.7 弦图的最大独立集/最小团覆盖
在完美消除序列上从左往右贪心,维护极大独立集。如果求出来的是 \(\{p_1,\cdots,p_k\}\) ,那么就选择 \(C(p_1),\cdots,C(p_k)\) 覆盖。显然这是个合法解。
设最大独立集大小为 \(a\) ,最小团覆盖大小为 \(b\) ,那么显然有 \(b\ge a\) ,而又有 \(a\ge k\ge b\) ,所以 \(a=k=b\) 。
4 子树图和团树
4.1 弦图的团树
(光看这个定义就啥也看不懂啊??)
\(\mu(G)\) 是所有极大团的集合, \(\mu_v(G)\) 则表示所有包含 \(v\) 的极大团的集合。
任意图上团树可能不存在,但弦图中是肯定存在的。下面给出一种构造方法。
在完美消除序列上从右往左依次加入每一个点,并维护加入每个点时新增的团是哪个,让这个点指向这个团。
现在要加入 \(i\) 。如果 \(C(i)=\{i\}\) 那么直接连向树上的任意一个点,否则设 \(j=\min C(i)\backslash \{i\}\) ,则有 \(C(i)\backslash \{i\}\subseteq C(j)\) 。
如果 \(C(i)\backslash \{i\}=C(j)\) 且 \(j\) 现在指向 \(C(j)\) ,那就直接把 \(i\) 也加入这个团。否则就把 \(C(i)\) 也加入树中,并连向 \(j\) 指向的团。
4.2 子树图与弦图的关系
子树图似乎是区间图的自然推广。需要注意的是, \(\mathcal F\) 不一定要包含所有子树,也可以包含相同的子树。
对于引理 4.1 ,只需要构造一个完美消除序列即可证明。这个只需要把所有子树按照深度最浅的点从深往浅排序即可。
4.3 团树和子树图的关系
一个图如果存在团树,就一定是子树图,就一定是弦图。
只需要把每个点 \(v\) 映射到团树上所有包含 \(v\) 的团组成的连通块即可。
于是就证明了这三者等价。
5 应用
模拟 kmp ,会得到 \(O(n)\) 个相等或不等关系。但是任意图求染色方案是 NPC ,所以肯定要挖掘性质。
盲猜它是弦图,也确实是。
先对 nxt 建树,那么对所有 \(x\in \text{anc}_{nxt_{i-1}}\) 且 \(x+1,i\) 不在同一棵子树的 \(x\) ,都有 \(x+1,i\) 颜色不同。
所以把点的编号换一下,变成 \(i\) 的父亲为 \(nxt_{i-1}+1\) 。此时对于树上两个有祖先关系的点,它们要么必须不相等,要么必须相等,并且只有这些限制。
所以对于一个相等的边连出的连通块,必然存在一个根。两个连通块不相等当且仅当根有祖先关系。
此时把每个连通块的根按深度从大到小排序就显然是个完美消除序列了。
注意到如果 \(k\) 小于最大团大小,那么 Bob 总可以在最大团里面选一个点,就死掉了。
建出团树,一开始随便选一个极大团 ban 掉。那么 Bob 选的点会对应某一个不包含这个极大团的子树。接下来就往这个方向选儿子,那么同时包含这两个极大团的点就废了,于是可以发现 Bob 无法走出这个子树。经过若干次之后 Bob 就被逼到叶子了,就死掉了。
不存在环等价于不存在三元环。
建出团树,那么问题就等价于给定一个子树族 \(\mathcal F\) ,要从中选出最多的子树,使得覆盖每个点的个数不超过 2 。
先分析一下团树的性质。显然极大团的大小不会超过 \(O(\sqrt m)\) ;根据团树的构建过程,所有极大团的大小之和不会超过 \(O(n+m)\) 。
直接设 \(dp_{x,i,j}\) 表示只考虑 \(x\) 子树,上面 \(i,j\) 对应的连通块被选择了,子树中最多还能被选几个。如果 \(i\ne -1,j\ne -1\) 那么直接往儿子转移,否则枚举这里是否要多放一个或两个。
复杂度突然就 \(O(m\sqrt m)\) 了!