回溯法求解最大团问题
#include <iostream>
#include <cstdlib>
using namespace std;
#define n 5
int a[n][n]= {{0,1,1,0,0},{1,0,1,1,1},{1,1,0,1,1},{0,1,1,0,1},{0,1,1,1,0}},x[n]= {0},bestx[n]= {0},bestn=0,cn=0;
bool Place(int t)
{
bool OK=true;
for(int j=0; j<t; j++)
{
if(x[j]==1&&a[t][j]==0)
{
OK=false;
break;
}
}
return OK;
}
void Backtrack(int t)
{
if(t>n)
{
if(cn>bestn)
{
for(int i=1; i<=n; i++)
{
bestx[i]=x[i];
}
bestn=cn;
}
return;
}
if(Place(t))
{
x[t]=1;
cn++;
Backtrack(t+1);
cn--;
}
if(cn+n-t>bestn)
{
x[t]=0;
Backtrack(t+1);
}
}
int main()
{
Backtrack(0);
cout<<bestn<<endl;
for(int i=0;i<n;i++)
{
cout<<bestx[i]<<" ";
}
return 0;
}