回溯法——最大团问题

109 阅读1分钟
  • cn:已经已经选好的顶点数
  • x:路径数组
  • a:两个顶点是否相连的信息
void backtrack(int i)
{
    if(i>n)
    {
        记录最优解;
        bestn = cn;  // 更新最优值
        return;
    }
    
    flag = true;
    
    // 左分支约束函数(判断当前顶点是否和已选入的顶点都有边相连)
    for(int j=1;j<i;j++)
    {
        if(x[j] ==1  && !a[i][j])  // 前者是寻找已经选择过的结点 ; 后者是判断他们是否相连
        {
            ok=false;
            break;
        }
    }
    // 如果ok=true,说明通过了约束判断,开始进入左分支
    if(ok)
    {
        x[i]=1;
        cn++;
        backtrack(i+1);
        cn--;
    }
    
    // 分析限界函数,进入右分支   “cn”代表已经选好的顶点数 ; "n-i"就代表剩余的顶点数
    if(cn+n-i > bestn)
    {
        x[i]=0;
        backtrack(i+1);
    }
    
}