用于求最大团的点数
只要在mp中赋值好n个点对其他所有的点的关系即可
#include<bits/stdc++.h>
using namespace std;
#define N 60
int n;
int mp[N][N];
int ans;
int alt[N][N];
int Max[N];
bool dfs(int cur,int tot)//cur是s1集合的个数
{
if(0==cur)
{
if(tot>ans)
{
ans=tot;return true;
}
return false;
}
for(int i=0;i<cur;i++)
{
if( tot+cur-i<=ans )return false;
int u=alt[tot][i];
if( Max[u]+tot<=ans )return false;
int next=0;
for(int j=i+1;j<cur;j++)
if(mp[u][ alt[tot][j] ])alt[tot+1][next++]=alt[tot][j];
if(dfs(next,tot+1)) return 1;
}
return 0;
}
int maxclique(void)
{
ans=0;
memset(Max,0,sizeof(Max));
for(int i=n-1;i>=0;i--)
{
int cur=0;
for(int j=i+1;j<n;j++)if(mp[i][j])alt[1][cur++]=j;//1为s1集合
dfs(cur,1);
Max[i]=ans;
}
return ans;
}
int main()
{
while(scanf("%d",&n),n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&mp[i][j]);
printf("%d
",maxclique());
}
return 0;
}