Bron–Kerbosch算法

BK算法使用搜索+剪枝来寻找无向图最大团。

一些定义

  1. :完全子图。
  2. 最大团:点数最大的团。
  3. 最大独立集 :最大的点集使得点集中任意两点都没有边直接相连。

(以上摘自OI wiki)

算法流程

先定义一些数组和变量(有的是\(dfs\)里的变量):

  • \(cnt[i]\)表示从\(i-n\)这些点的最大团点数
  • \(vis[i]\)存当前搜到的团
  • \(now\)表示现在正在搜团内第\(now\)个点(注意现在团内只有\(now-1\)个点)
  • \(x\)表示当前搜到的点
  • \(ans\)表示当前答案

首先我们肯定要按照一定的顺序搜索(这里我们标号从大到小搜),然后我们用正常思路爆搜,当然我们需要加一些剪枝:

  1. \(now-1+cnt[i] \leq ans\)时直接退出(最优性剪枝)
  2. 只有当前点和当前的团还能组成最大团时才继续递归(可行性剪枝)

(感觉光从文字非常难以理解,还是建议看代码理解)

例题:

  1. poj 1419 Graph Coloring 题解(代码可以在这里看)
posted @ 2020-06-03 20:57  With_penguin  阅读(1290)  评论(0编辑  收藏  举报