BK算法使用搜索+剪枝來尋找無向圖最大團。
一些定義
- 團:完全子圖。
- 最大團:點數最大的團。
- 最大獨立集 :最大的點集使得點集中任意兩點都沒有邊直接相連。
(以上摘自OI wiki)
算法流程
先定義一些數組和變量(有的是\(dfs\)里的變量):
- \(cnt[i]\)表示從\(i-n\)這些點的最大團點數
- \(vis[i]\)存當前搜到的團
- \(now\)表示現在正在搜團內第\(now\)個點(注意現在團內只有\(now-1\)個點)
- \(x\)表示當前搜到的點
- \(ans\)表示當前答案
首先我們肯定要按照一定的順序搜索(這里我們標號從大到小搜),然后我們用正常思路爆搜,當然我們需要加一些剪枝:
- 當\(now-1+cnt[i] \leq ans\)時直接退出(最優性剪枝)
- 只有當前點和當前的團還能組成最大團時才繼續遞歸(可行性剪枝)
(感覺光從文字非常難以理解,還是建議看代碼理解)
例題:
- poj 1419 Graph Coloring 題解(代碼可以在這里看)