您的位置:首页 > 其它

hdu 1530最大团模板

2017-09-02 21:24 351 查看
求一个图中的最大的点的集合,集合要求集合内的点相连为完全图。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 60;
int g[maxn][maxn], dp[maxn], stk[maxn][maxn], mx;
int dfs(int n, int ns, int dep)
{
if (0 == ns) {
if (dep > mx) mx = dep;
return 1;
}
int i, j, k, p, cnt;
for (i = 0; i < ns; i++) {
k = stk[dep][i];
cnt = 0;
if (dep + n - k <= mx) return 0;
if (dep + dp[k] <= mx) return 0;
for (j = i + 1; j < ns; j++) {
p = stk[dep][j];
if (g[k][p]) stk[dep + 1][cnt++] = p;
}
dfs(n, cnt, dep + 1);
}
return 1;
}
int clique(int n)
{
int i, j, ns;
for (mx = 0, i = n - 1; i >= 0; i--) {
// vertex: 0 ~ n-1
for (ns = 0, j = i + 1; j < n; j++)
if (g[i][j]) stk[1][ ns++ ] = j;
dfs(n, ns, 1);
dp[i] = mx;
}
return mx;
}
int main()
{
int n;
while(~scanf("%d", &n),n) {
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
scanf("%d", &g[i][j]);
int ans = clique(n);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: