Bron–Kerbosch

前言

网上找不到好的讲解,我也不懂,所以只存一下代码,或者提醒自己有这么个东西。

讲解

该算法用于求最大团,其实就是加了一堆剪枝的 dfs,但据说时间复杂度是 \(O(3^{n/3})\) 的。

听上去很离谱,不过确实跑得快。

代码

板子是网上抄的。

int n,m,ans = -1;
int a[MAXN],cnt[MAXN];
bool e[MAXN][MAXN];
bool dfs(int x,int now)
{
	for(int i = x+1;i <= n;++ i)
	{
		if(cnt[i]+now <= ans) return 0;
		if(!e[x][i]) continue;
		for(int j = 1;j <= now;++ j)
		{
			if(j == now)
			{
				a[now] = i;
				if(dfs(i,now+1)) return 1;
			}
			else if(!e[i][a[j]]) break;
		}
	}
	if(now-1 > ans)
	{
		ans = now-1;
		return 1;
	}
	return 0;
}

int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n = Read(); m = Read();
	for(int i = 1,u,v;i <= m;++ i) u = Read(),v = Read(),e[u][v] = e[v][u] = 1;
	for(int i = n;i >= 1;-- i)
	{
		a[1] = i;
		dfs(i,2);
		cnt[i] = ans;
	}
	return 0;
}
posted @ 2021-10-29 20:36  皮皮刘  阅读(184)  评论(0编辑  收藏  举报