http://acm.hdu.edu.cn/showproblem.php?pid=1530
Problem Description Given a graph G(V, E), a clique is a sub-graph g(v, e), so that for all vertex pairs v1, v2 in v, there exists an edge (v1, v2) in e. Maximum clique is the clique that has maximum number of vertex.
Input Input contains multiple tests. For each test:
Output One number for each test, the number of vertex in maximum clique.
Sample Input 5 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0
Sample Output 4
Author CHENG, Long
Source
Recommend mcqsmall |
#include<bits/stdc++.h>
#define N 1066
bool a[N][N];
int ans, cnt[N], group[N], n, m, vis[N];
bool dfs( int u, int pos )
{
int i, j;
for( i = u+1; i <= n; i++)//按递增顺序枚举顶点
{
if( cnt[i]+pos <= ans ) return 0;//剪枝
if( a[u][i] )
{
// 与目前团中元素比较,取 Non-N(i)
for( j = 0; j < pos; j++ ) if( !a[i][ vis[j] ] ) break;
if( j == pos )
{
vis[pos] = i;
if( dfs( i, pos+1 ) ) return 1;
}
}
}
if( pos > ans )
{
for( i = 0; i < pos; i++ )
group[i] = vis[i]; // 更新最大团元素
ans = pos;
return 1;
}
return 0;
}
void maxclique()//求最大团
{
ans=-1;
for(int i=n; i>0; i--)
{
vis[0]=i;
dfs(i,1);
cnt[i]=ans;
}
}
int main()
{
int T;
while(~scanf("%d",&n))
{
if(n==0) break;
int x, y;
memset( a, 0, sizeof(a));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d",&a[i][j]);
maxclique();
if( ans < 0 ) ans = 0;
printf("%d\n", ans );
}
}