[HDU]1530 Maximum Clique 最大团问题[模板]

题目:  给出一个无向图, 求出其中的最大团.

题解: 最大团是一个NP完全问题...这道题爆搜+优化就能过. 爆搜是枚举所有子图(当然要是团). 优化是加入一个记忆化搜索的数组f, f[i]表示i-n这些点中能组成的最大团点数. 然后记忆化搜的时候如果当前枚举到i时(还没选i)的最大团点数 + f[i]小于全局最大团(已求得的最大团)的话, 就continue. 还有就是如果当前能选的点+已有最大团 < 全局最大团的话也return.

#include<stdio.h>
#define N 55
int n, ans, mp[N][N], f[N], now[N];
void dfs(int u, int sum){
	if(sum > ans) ans = sum;
	int able = 0, tnow[N];
	for(int i = u + 1; i <= n; ++i){
		tnow[i] = now[i];
		if(now[i]) able++;
	}
	if(sum + able <= ans) return;
	for(int i = u + 1; i <= n; ++i){
		if(!tnow[i]) continue;
		if(f[i] + sum <= ans) continue;
		for(int j = u + 1; j <= n; ++j)
			now[j] = tnow[j] & mp[i][j];
		dfs(i, sum + 1);
	}
}
inline int Max_Clique(){
	ans = f[n] = 1;
	for(int i = n - 1; i; --i){
		for(int j = 1; j <= n; ++j)
			now[j] = mp[i][j];
		dfs(i, 1);
		f[i] = ans;
	}
	return ans;
}
int main(){
	while(~scanf("%d", &n) && n){
		for(int i = 1; i <= n; ++i)
			for(int j = 1; j <= n; ++j)
				scanf("%d", &mp[i][j]);
		printf("%d\n", Max_Clique());
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值