立个flag——寒假回家之前,一天至少一个算法。
预备知识
完全子图:给定无向图$G=(V,E)$,其中$V$是节点集,E是边集。$G’=(V’,E’)$如果节点集$V’\subseteq V$,边集$E’\subseteq E$,且$G’$中任意两个节点有边相连,则称$G’$是$G$的完全子图。
团:$G$的完全子图$G’$是$G$的团,当且仅当$G’$不包含在$G$的更大的完全子图中,也就是说$G’$是$G$的极大完全子图。
最大团:$G$的最大团是指$G$的所有团中,含节点最多的团。
dfs解法
对于一个n个节点的图,最优解为一个n维0-1向量,表示对应节点是否在最大团中。于是我们就构造这么一棵子集树,深度为n,其中包含了所有可能的情况,即$2^{n+1}-1$种。
- 约束条件
假设当前扩展节点处于解空间树的第t层,那么从第一个节点到第t-1个节点的状态(是否在团里)已经确定,接下来沿着扩展节点的左分支进行扩展,此时需要判断是否将第t个节点放入团里。只要第t个节点与前t-1个节点被选中的节点(在团里的那些节点)均有边相连,则能放入团里,即$x[t]=1$;否则,就不能放入团里,即$x[t]=0$。
- 限界条件
假设当前扩展节点处于解空间树的第t层,那么从第一个节点到第t-1个节点的状态(是否在团里)已经确定。接下来要确定第t个节点的状态,无论沿哪个方向进行扩展,第t个节点的状态就确定了。那么,从第t+1个节点到第n个节点的状态还不确定。这样,可以根据前t个节点的状态确定当前已放入团里的节点个数(用cn表示),假象从第t+1个节点到第n个节点全部放入团里,放入的节点个数(用fn表示)$fn=n-t$,则$cn+fn$是所有从根出发的路径中前t-1个状态如上相同的可行解所包含的节点个数的上界。
如果$cn+fn$小于或等于当前最优解包含的节点个数bestn,则说明不需要再向子孙节点搜索。
算法模板
1 | //hdu 1530 AC代码 |
本文链接:
https://luojinrong.github.io/2019/01/10/最大团/