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

本文介绍了一种使用子集树思想解决最大团问题的方法,并通过示例代码详细展示了如何求解图中的最大联通子集。该问题在图论中具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上已经有很多关于最大团的文章了,这里主要还是要用到子集树的思路,另外就是判定条件要特别注意!另外这个问题特别出名而且实用,需要多注意。代码中的矩阵为图的邻接矩阵,要求得是在图中最大联通子集。
/******************************************************
* 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");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值