zoukankan      html  css  js  c++  java
  • 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 题解(代码可以在这里看)
    由于博主比较菜,所以有很多东西待学习,大部分文章会持续更新,另外如果有出错或者不周之处,欢迎大家在评论中指出!
  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/With-penguin/p/13040032.html
Copyright © 2011-2022 走看看