不了解极大团(maximal clique)的,请看极大团这篇文章
参考资料:
当给出一个图后,我们应该怎么去寻找其中的极大子团呢?
寻找极大子团的最简单的思想是:
1.生成原始图的所有子图(可能的子图有2*n个,n代表顶点个数)
2.判断这些子图是不是团
3.将不是极大团的团删除
Born_Kerbosch算法
这个算法主要构造三个集合:
R集合:存储当前极大团中加入的顶点
P集合:存储可能还加入的点
X集合:存储的是已经假如过某个极大团的点(作用是判重,因为会从每个顶点开始,枚举所有团,如果不对已经加入到某个极大团的顶点进行标记,可能会有重复极大团的出现)
基础Born_kerbosch算法:
1.对于任意一个在集合P中的顶点V,我们把V加入到R集合(集合P中的每一个顶点均与R集合中所有的点是连接的,所以加入顶点V后,依然能保证集合R是个团),然后对在P集合中且与V相连的这部分点中,寻找下一个可能加入到R集合的点。(意思就时加入点v至R集合后更新P集合,使P集合中的任意一个点依然能和R集合中每一个点都是连接的。因为这里新R集合中加入了V,所以只要是原p集合中且与v顶点相连的这些顶点就是与新R集合中所有顶点相连)
2.回溯时把顶点V从P中移除并加入到X集合,表示在当前状态下包含顶点V的极大团已经计算完毕。
3.R集合为极大团时,必须满足P与X都是空的。P存放的是还可能加入到极大团R中的点,P集合为空表示已经没有点能加入到R中了。而X中存放的是已经完成极大团计算的点,且X集合中的任意一个点必然是与R中每个顶点都连接(因为我们每次向下dfs时,还对P和X分别进行取与R集合内都连接的操作来保证,而且X中的点就是从R中取出的点,当然会和R集合中的每个点都连接),即X中的点必然可以和R集合构成极大团。如果X集合不为空的话,可以把X的点加入到R集合中从而构成一个团R1,R1的顶点数大于R,说明R就不是一个极大团,R1集合中的极大团是之前计算包含x集合中的点的极大团的时候计算过了的,故当且仅当P、X集合都为空时R才是一个极大团。
Born_Kerbosch算法的优化
来源:https://www.cnblogs.com/lfxiao/p/12501744.html