小白笔记-------------------------最大团问题

网上已经有很多关于最大团的文章了,这里主要还是要用到子集树的思路,另外就是判定条件要特别注意!另外这个问题特别出名而且实用,需要多注意。代码中的矩阵为图的邻接矩阵,要求得是在图中最大联通子集。
/******************************************************
* Author       : Aaron92
* Date		   : 2016-05-23 16:54
* Filename     : MaxClique.c
* Description  : 
******************************************************/

#include
#include
#include
#include

#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");
	}
}

你可能感兴趣的:(linux-c,算法设计)