前言
网上找不到好的讲解,我也不懂,所以只存一下代码,或者提醒自己有这么个东西。
讲解
该算法用于求最大团,其实就是加了一堆剪枝的 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;
}