zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    [SDOI2006] 保安站岗
    [NOIP2003] 传染病控制
    [USACO13OPEN] 照片Photo
    [HNOI/AHOI2018] 道路
    [TJOI2007] 线段
    [HAOI2009] 逆序对数列
    codeforces|CF1054D Changing Array
    hihoCoder 1785
    luogu 1712
    luogu 3248
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/15483415.html
Copyright © 2011-2022 走看看