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)\) 了!