网上已经有很多关于最大团的文章了,这里主要还是要用到子集树的思路,另外就是判定条件要特别注意!另外这个问题特别出名而且实用,需要多注意。代码中的矩阵为图的邻接矩阵,要求得是在图中最大联通子集。
/******************************************************
* Author : Aaron92
* Date : 2016-05-23 16:54
* Filename : MaxClique.c
* Description :
******************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#define n 5
int x[6];
int bestx[6];
int cn ;
int bestn ;
int a[6][6] = {{0,2,2,2,2,2},{2,0,1,2,1,1},{2,1,0,1,2,1},{2,2,1,0,2,1},{2,1,2,2,0,1},{2,1,1,1,1,0}};
main(int argc,char ** argv){
cn = 0;
bestn = 0;
backtrack(1);
}
int backtrack(int i){
if(i > n){
if(cn > bestn){
int j = 1;
for(j;j <= n;j++){
bestx[j] = x[j];
printf("%d\t",bestx[j]);
}
bestn = cn;
printf("\n");
printf("%d\n",bestn);
return;
}
}
int s = 1;
int OK = 1;
for(s;s <= i;s++){
if(x[s] && (a[s][i] == 2)){
OK = 0;
break;
}
}
if(OK){
x[i] = 1;
cn++;
backtrack(i+1);
x[i] = 0;
cn--;
}
if(cn+n-i > bestn){
x[i] = 0;
backtrack(i+1);
}
}
print(int (*f)[6])
{
int i ,j;
for(i = 0;i < 6;i++){
for(j = 0;j < 6;j++){
printf("%d\t",f[i][j]);
}
printf("\n");
}
}