最大独立集=补图的最大团
最大团=补图的最大独立集
对于二分图的最大独立集:最大独立集==顶点数-匹配数
对于普通图的最大独立集:普通图的最大独立集==补图的最大团
最大团模板题:http://acm.hdu.edu.cn/showproblem.php?pid=1530
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
#define maxn 55
int n ;
int mp[maxn][maxn];
int ans[maxn];
int save[maxn];
int cnt;
int mm;
void dfs(int x)
{
if( x > n )
{
mm = cnt ;
for(int i = 0 ; i < cnt ; ++i)
{
ans[i] = save[i];
}
return ;
}
int flag = 1;
for(int i = 1 ; i <= n ; ++i)
{
if( save[i] && !mp[i][x] )
{
flag = 0;
break;
}
}
if( flag )
{
save[x] = 1;
cnt++;
dfs( x + 1 );
cnt--;
save[x] = 0;
}
if( cnt + n - x > mm )
{
dfs( x + 1 );
}
}
int main()
{
while( cin >> n && n )
{
memset(save,0,sizeof(save));
cnt = 0 ;
mm = 0 ;
for(int i = 1 ; i <= n ; ++i)
{
for(int j = 1 ; j <= n ; ++j)
{
scanf("%d",&mp[i][j]);
}
}
dfs(1);
cout << mm << endl;
}
}