chordal graph
cycle / chord / hole / triangle
「環」是串成一圈的路線,沒有重複的點。
「弦」是環上不相鄰兩點之間的邊。
「洞」是一種特別的環,沒有弦。
「三角形」是三條邊的環,沒有弦。
ICPC 7661
chordal graph(monotone transitive graph)
「弦圖」。多於三條邊的環,必有弦。
換句話說,多於三條邊的洞,必不存在。
弦圖的定義,隱含著遞迴。一個環,從弦切開,形成兩個環,仍需要遞迴切開。所有環切碎成三角形。一個環可以同時切開多處。
弦圖的外觀,宛如許多三角形交錯疊合,附帶許多樹、許多鏈。
學過「三角剖分」的讀者要特別當心,三角剖分通常不是弦圖。
弦圖隨便刪除幾個點(以及連帶的邊),仍是弦圖。換句話說,弦圖的導出子圖是弦圖。
森林、有向無環圖、二分圖、弦圖,都具有這種遞歸性質。
perfect elimination ordering
楔子
「有向無環圖」擁有「拓樸順序」。反之亦然。 「弦圖」擁有「完美消除順序」。反之亦然。
simplicial vertex【註:古代名稱,今日看來詞不達意。】
「單體點」。該點的所有鄰居,之間必有邊。
換句話說,該點的所有鄰居,形成團。
換句話說,該點暨所有鄰居,形成極大團。
perfect elimination ordering
「完美消除順序」。逐次刪除當下的任意一個單體點,所得到的順序。通常有許多種。
刪除單體點,擁有諸多意義:
一、單體點所屬的極大團的大小減一。
二、單體點的鄰邊們,視作弦。單體點所屬的環們,從弦切開。環被削去一角,留下弦。
三、單體點i,鄰居j,鄰居k,形成三角形ijk。邊ji暨邊ik繞遠路,邊jk抄近路。刪除遠路,保留近路。
elimination graph / elimination tree
「消除圖」。完美消除順序可以畫成有向圖。
每個單體點源自哪個團。
「消除樹」。完美消除順序可以畫成有向森林。
當前點的父親,是順序更大、順序最早的鄰居。
時間複雜度等於一次graph traversal的時間。
perfect elimination ordering testing
檢查一個順序是不是完美消除順序。
一、遞增法。時間複雜度O(V³)。
依序掃描,逐一檢查是否為單體點。檢查所有鄰居是否為團──鄰居之間所有點對,必須都有邊。
graph traversal
楔子
有向無環圖的拓樸順序:特殊BFS順序、DFS逆序 弦圖的完美消除順序:MCS逆序、LexBFS逆序、LexDFS逆序
除了BFS、DFS,再補充三個遍歷演算法MCS、LexBFS、LexDFS,用來找到團。
maximum cardinality search(MCS)
每回合找到一個點,連往已拜訪點的邊數最多。如果很多點同時符合條件,則任選一點。
時間複雜度O(V²)。運用binary heap壓至O(V+ElogV)。運用Fibonacci heap壓至O(E+VlogV)。運用bucket sort壓至O(V+E)。
這些加速技巧,也出現在單源最短路徑演算法。請見本站文件「path」。
補充一下bucket sort的時間複雜度分析。隨時紀錄最大值放在哪個桶子。刪除最大值、尋找次大值,只需笨拙地不斷減一,直到遭遇次大值。
邊數總是加一,總共加E。尋找次大值,總共頂多減E。時間複雜度O(V+E)。
lexicographic breadth-first search(LexBFS)
BFS深入考慮細節。仔細安排小孩的拜訪順序:優先擴大團。
i from V-1 to 0 取字串最大的點。 所有未拜訪鄰居,字串尾端添加i。
BFS:優先拜訪深度最小的點。 LexBFS:深度平手時,優先拜訪字串最大的點。 LexBFS-:字串平手時,優先拜訪索引值最小的點。
時間複雜度O(V²)。運用bucket sort壓至O(V+E)。
lexicographic depth-first search(LexDFS)
DFS深入考慮細節。仔細安排子孫的拜訪順序:優先擴大團。
i from 0 to V-1 取字串最大的點。 所有未拜訪鄰居,字串開頭添加i。
DFS:優先拜訪深度最大的點。 LexDFS:深度平手時,優先拜訪字串最大的點。 LexDFS+:字串平手時,優先拜訪索引值最大的點。
時間複雜度O(V²)。運用binary heap壓至O(V+ElogV)。運用vEB tree壓至O(V+EloglogV)。
數學證明:弦圖⇔ MCS逆序是完美消除順序
(⇒)遞迴刪除單體點:
一、遍歷過程,不受未拜訪點的影響。因此,一張圖刪除最後一個拜訪的點,重新實施遍歷演算法,遍歷順序依然相同。
二、遍歷過程,優先擴大團。因此,最後一個拜訪的點,必是極大團的點,必是單體點。
(⇐)先前章節提過,完美消除順序必得弦圖。
MCS逆序、LexBFS逆序、LexDFS逆序,三者皆是如此。
chordal graph recognition
判斷弦圖,只需針對特定順序,無須窮舉各種順序。
MCS逆序、LexBFS逆序、LexDFS逆序,檢查是否為完美消除順序。挑一種檢查即可。
ICPC 2424 6308
延伸閱讀:各種遍歷演算法的關聯
GEN / | \ BFS MNS DFS | / | \ | LexBFS MCS LexDFS
MNS系統可以用來找到完美消除順序。
interval graph
split graph
split graph
(G == split) iff (G == chordal && ~G == chordal) (G == split and G == permutation) iff (G == interval and ~G == interval)
延伸閱讀:弦圖推廣成有向圖
我不清楚是否有人研究。「弦」可能有兩種定義:
一、一個有向環,不相鄰兩點之間的有向邊。
二、一雙有向路徑,橫跨路徑的有向邊。
一個有向環,從弦切開,形成一個有向環、一雙有向路徑。只能遞迴其中一邊。怪怪的。
一雙有向路徑,從弦切開,形成兩雙有向路徑,但是重疊於弦。怪怪的。
延伸閱讀:完美消除順序推廣成有向圖
修改單體點的定義:該點若有入邊ji與出邊ik,則必有邊jk。
「單調遞移圖monotone transitive graph」就是擁有「完美消除順序」的圖。反之亦然?【尚待確認】
chain graph
chain graph
二分圖,X群(Y群)存在一種點順序:當前點的鄰居,包含之後所有點的鄰居。
(G == chain) iff (G == bipartite && C(G) == chordal) C(G): make X and Y cliques
《Computing the Minimum Fill-In is NP-Complete》