http://acm.hdu.edu.cn/showproblem.php?pid=1530
题意:以邻接矩阵方式输入一个图,求图的最大完全子图。
思路:最大团,狠暴力的算法。直接贴模板
#include <stack>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int n, res;
bool vis[55];
int num[55];//每个点的子结点数
int mapn[55][55]; //邻接矩阵
int Dfs(int rt, int sum)
{
if(rt > n){
if(sum > res)
res = sum;
return 0;
}
if(sum + n - rt < res)
return 0;
if(sum > num[rt]){
Dfs(rt+1, sum);
return 0;
}
int i;
for(i = 1; i < rt; i++){
if(vis[i] && !mapn[i][rt])
break;
}
if(i == rt){
vis[rt] = true;
Dfs(rt+1, sum+1);
vis[rt] = false;
}
Dfs(rt+1, sum);
return 0;
}
int main()
{
while(~scanf("%d", &n) && n){
memset(num, 0, sizeof(num));
for(int i = 1; i <= n; i++){
vis[i] = false;
for(int k = 1; k <= n; k++){
scanf("%d",&mapn[i][k]);
num[i] += mapn[i][k];
}
}
res=0;
Dfs(1, 0);
printf("%d\n",res);
}
return 0;
}