搞懂了什么是团  什么是极大团  什么是最大团

极大团就是  不是任何团的真子集  最大团就是点数最多的极大团

这题就是求极大团的个数

用bk算法

#include <iostream>
#include <string>
#include <algorithm>
#include <map> #include <stack>
#include <cstring>
#include<cstdio> using namespace std; int n,m;
int ans;
int G[][];
int all[][];//第j个极大团所包含的节点
int some[][];
int none[][]; void dfs(int x,int an,int sn,int nn){
if(!sn&&!nn){
ans++;
//输出极大团
// for(int i=1;i<=an;i++)
// cout<<all[x][i]<<" ";
// cout<<endl;
}
if(ans>)
return; int key=some[x][];
for(int j=;j<=sn;j++){
int v=some[x][j];
int tsn=;
int tnn=; //剪枝,与key相连的,必被搜索过
if(G[key][v])
continue; for(int i=;i<=an;i++)
all[x+][i]=all[x][i];
all[x+][an+]=v; for(int i=;i<=sn;i++)
if(G[v][some[x][i]])
some[x+][++tsn]=some[x][i]; for(int i=;i<=nn;i++)
if(G[v][none[x][i]])
none[x+][++tnn]=none[x][i]; dfs(x+,an+,tsn,tnn); some[x][j]=;
none[x][++nn]=v;
} } int main()
{ while(~scanf("%d%d",&n,&m)){
ans=;
memset(G,,sizeof(G));
int a,b;
for(int i=;i<m;i++){
scanf("%d%d",&a,&b);
G[a][b]=;
G[b][a]=; } for(int i=;i<=n;i++)
some[][i]=i; dfs(,,n,); if(ans > )
puts("Too many maximal sets of friends.");
else
printf("%d\n", ans); } return ; }
04-25 13:45