summaryrefslogtreecommitdiff
path: root/graph/bronKerbosch.cpp
blob: caf2421669252ea68b3a6cb5468876361546a629 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using bits = bitset<64>;
vector<bits> adj, cliques;

void addEdge(int a, int b) {
	if (a != b) adj[a][b] = adj[b][a] = 1;
}

void bronKerboschRec(bits R, bits P, bits X) {
	if (!P.any() && !X.any()) {
		cliques.push_back(R);
	} else {
		int q = (P | X)._Find_first();
		bits cands = P & ~adj[q];
		for (int i = 0; i < sz(adj); i++) if (cands[i]){
			R[i] = 1;
			bronKerboschRec(P & adj[i], X & adj[i], R);
			R[i] = P[i] = 0;
			X[i] = 1;
}}}

void bronKerbosch() {
	cliques.clear();
	bronKerboschRec({}, {(1ull << sz(adj)) - 1}, {});
}