一些定義
最小染色:用最少的顏色給點染色使得所有邊連線的兩點顏色不同。
色數:最小染色的顏色數。
團數:最大團的點數。
弦:連線環中不相鄰兩點的邊。
弦圖:任意長度大於 \(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)\} \}\) 為圖的最小團覆蓋。