コード例 #1
0
ファイル: BronKerbosch.cpp プロジェクト: draak-krijger/test
void BronKerbosch(ll n, ll R, ll P, ll X) // initial call (0,(1LL<<n) - 1,0)
{
    if (P == 0LL && X == 0LL)
    {
        ll t = 0;
        vector <ll> v;
        for (ll i = 0; i < n; i++)
            if ((1ll << i) & R)
                t ++, v.pb (i + 1);
        if (t > res)
        {
            res = t;
            clique = v;
        }
        res = max(res, t);
        return;
    }
    ll u = 0;
    while (!((1ll<<u) & (P|X)))
        u ++;
    for (ll v = 0; v < n; v++)
    {
        if (((1ll << v) & P) && !((1ll << v) & N[u]))
        {
            BronKerbosch(n, R | (1ll << v), P & N[v], X & N[v]);
            P -= (1ll << v);
            X |= (1ll << v);
        }
    }
}
コード例 #2
0
// ne[u] is the neighbours of u
// v is the result, P = (1<<n) - 1
void BronKerbosch(ll R, ll P, ll X){
	if ((P == 0LL) && (X == 0LL)) {v.push_back(R);return ;}
	int u = 0;
	for (; u < n; u ++) if ( (P|X) & (1LL << u) ) break;
	for (int i = 0; i < n; i ++)
		if ( (P&~ne[u]) & (1LL << i) ){
			BronKerbosch(R | (1LL << i), P & ne[i], X & ne[i]);
			P -= (1LL << i); X |= (1LL << i);
		}
}