题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1530
题目分类:最大团问题 DP + DFS
代码:
#include<bits/stdc++.h> using namespace std;
const int V=;
int g[V][V], dp[V], stk[V][V], mx;
int dfs(int n, int ns, int dep)
{
if ( == ns)
{
if (dep > mx) mx = dep;
return ;
}
int i, j, k, p, cnt;
for (i = ; i < ns; i++)
{
k = stk[dep][i]; cnt = ;
if (dep + n - k <= mx) return ;
if (dep + dp[k] <= mx) return ;
for (j = i + ; j < ns; j++)
{
p = stk[dep][j];
if (g[k][p]) stk[dep + ][cnt++] = p;
}
dfs(n, cnt, dep + );
}
return ;
} int clique(int n)
{
int i, j, ns;
for (mx = , i = n - ; i >= ; i--)
{
// vertex: 0 ~ n-1
for (ns = , j = i + ; j < n; j++)
if (g[i][j]) stk[][ ns++ ] = j;
dfs(n, ns, ); dp[i] = mx;
}
return mx;
} int main()
{
int n;
while(scanf("%d",&n)&&n)
{
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
scanf("%d",&g[i][j]);
}
}
int ans=clique(n);
printf("%d\n",ans);
}
return ;
}