1. 程式人生 > >完美消除序列,MCS演算法

完美消除序列,MCS演算法

首先,我們有一些定義

對於普通圖的兩個性質:

最大數 ≤ 最小染色數
最大獨立集 最小團覆蓋

而在弦圖就變成了:

最大團數=最小色數
最大獨立集=最小團覆蓋

對與序列中的點vi,排在vi後面並且和vi相連的點是一個團
一個圖存在完美消除序列是它是弦圖的充要條件

那麼完美消除序列有什麼用呢?用處可大啦
求弦圖的最大團數/最小色數的時候,只要在完美消除序列上從後往前貪心染色即可。
而求最大獨立集/最小團覆蓋的時候,只要在完美消除序列上從前往後貪心取點即可。

MCS演算法

從後往前確定序列的點,每取一個點都把還沒加入序列的和它相連的點的標號+1,每次取點選擇標號最大的點之一。
具體實現好難描述不想說了= =下面有程式碼,複雜度O(m+n)

據說如果圖是弦圖,這個演算法求出來的序列可以保證是完美消除序列
那麼當我們需要判定弦圖的時候,就要判斷這個序列是不是完美消除序列了。
判斷的方法是:
從後往前確定序列中的每個點v是否滿足條件:排在v後面的和v相連的點集記為N(v)中排在最前的點記為next(v)是否和N(v)中其他點都相連。
具體實現是,點數少的話直接拿鄰接矩陣判相連O(m+n),點數多就把邊表排序然後二分O(mlogm+n)。