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); } } }
// 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); } }