Bron–Kerbosch算法
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 题解(代码可以在这里看)
由于博主比较菜,所以有很多东西待学习,大部分文章会持续更新,另外如果有出错或者不周之处,欢迎大家在评论中指出!