Bounds on the Chromatic Number
How many colors do you truly need to properly color a graph? Can you tell without exhaustively searching? This question sits at the heart of Graph Coloring and Chromatic Number. The honest answer is that computing the chromatic number exactly is NP-hard in general. What rescues us in practice is a triangle of bounds. There is an easy lower bound from cliques. There is an easy upper bound from greedy coloring. And there is a deep structural theorem — Brooks' theorem. It says the greedy upper bound is almost always wildly pessimistic. It can be sharpened dramatically, except in two rigid exceptional families. This matters for a key reason. Bounding without computing it is often all we can do for large graphs. It also matters because the gap between the trivial bounds and the truth reveals genuine structure. Bipartiteness, cycles, cliques, and regularity all leave fingerprints on the chromatic number. The interplay of an elementary greedy argument with a subtle case-by-case induction (Brooks) is a template for a great deal of extremal graph theory. The big picture is a sandwich:
where is the clique number and the maximum degree. Brooks' theorem tells us exactly when the upper bound can be improved to itself. This article proves the greedy bound and proves the clique bound. It also gives a complete, rigorous proof of Brooks' theorem. Worked examples pin down exactly where each bound is tight and where it is loose. This is also a natural gateway to more powerful machinery. Bounding chromatic numbers of huge or randomly-structured graphs foreshadows The Probabilistic Method Introduction. There, one shows colorings exist without ever constructing them.
- The clique number always lower-bounds the chromatic number: , proved by an injectivity argument.
- Greedy coloring in any vertex order gives , using only the Degree and the Handshake Lemma idea that each vertex has at most already-colored neighbors.
- Brooks' theorem (1941) sharpens this: unless is complete or an odd cycle.
- The proof of Brooks' theorem is a genuine case analysis on connectivity (via a clever "good ordering" and, in the 2-connected non-complete case, a rotation/fan argument at a cut vertex or a careful choice of last three vertices).
- Neither bound is tight in general: can be far below (triangle-free graphs with huge chromatic number exist), and can far exceed (stars, complete bipartite graphs).
- Key idea: sandwiching between an easy clique bound and an almost-always-improvable degree bound turns a hard global question into a local, checkable one.
Where this lives today
Brooks' theorem and its companion bounds are foundational in algorithmic graph coloring: many greedy and local-search heuristics for register allocation in compilers rely on the guarantee that colors always suffice, with Brooks' theorem explaining why real-world graphs (which are rarely complete graphs or odd cycles) usually need noticeably fewer registers than the naive bound suggests. In scheduling and resource allocation, conflict graphs modeling jobs that cannot run simultaneously are colored to find minimum-length schedules, and Brooks' theorem gives a fast certificate that a schedule of length exists without solving the full NP-hard chromatic number problem. In theoretical computer science, Brooks' theorem underlies efficient distributed and parallel -coloring algorithms, since it guarantees the target is achievable before any algorithm searches for it. In statistical physics, the chromatic polynomial and colorings of graphs correspond to zero-temperature antiferromagnetic Potts models, where bounds like Brooks' theorem constrain the ground-state entropy. In combinatorics itself, the clique-number lower bound and greedy upper bound are the opening moves in the broader study of perfect graphs (where exactly) and in probabilistic constructions — foreshadowing The Probabilistic Method Introduction — of triangle-free graphs with arbitrarily large chromatic number, showing just how far and can diverge.
Ask the tutor: How does Brooks' theorem generalize to list coloring, and what does that reveal about the probabilistic method's approach to chromatic bounds?
Let be a finite simple graph. A proper -coloring of is a function such that whenever . The chromatic number is the least for which a proper -coloring exists. A clique in is a set of pairwise adjacent vertices. The clique number is the size of the largest clique in . The maximum degree is . Given a linear order of , the greedy coloring with respect to this order assigns to each , in increasing order of , the least positive integer not already used on any neighbor with .
Intuition
Think of as squeezed between two numbers you can compute quickly. On one side, if you can find a clique of size inside , you instantly know : every vertex in a clique needs its own color, since all pairs are adjacent. This gives a lower bound that is easy to produce (just exhibit the clique) but can be a bad estimate, because can be forced up by global obstructions — like long odd cycles — that have no large clique at all. On the other side, greedy coloring in any order never uses more than colors, because when you reach a vertex , it has at most already-colored neighbors, so at most colors are forbidden and some color in is free. This is an upper bound that requires no cleverness to prove, but it is often extremely loose: a star has yet . Brooks' theorem is the statement that this greedy slack is not an accident of bad luck — it happens essentially always. Only two families of connected graphs actually need colors: complete graphs (where , so the clique bound and greedy bound coincide and are tight) and odd cycles (where but , again forcing ). Every other connected graph can be colored with only colors.
Let be a finite simple graph.
(a) .
(b) For any linear order of , the greedy coloring with respect to that order uses at most colors; consequently .
(a) Let and let be a clique of size . Let be any proper coloring of using colors. Since every pair () is adjacent, properness forces . Hence restricted to is an injective function from an -element set into , so . This uses no hypothesis beyond being simple.
(b) Fix any linear order of and run the greedy algorithm. We show by strong induction on that the color assigned lies in and that the resulting coloring is proper. Well-definedness and range. When the algorithm processes , it looks at the set of already-colored neighbors. Since by definition of , we have . The colors already used on therefore form a subset of of size at most , so at least one value in is unused among them; the algorithm assigns to be the least such value. Hence for every . Properness. Suppose with . When is processed, , so the color is explicitly excluded from consideration and the algorithm assigns . As this holds for every edge, is a proper coloring. Thus is a proper coloring using colors from , a set of size , so .
∎There exists, for every graph , a linear order of for which greedy coloring uses exactly colors.
Let be an optimal proper coloring using colors . Order so that all vertices colored come first, then all colored , and so on (ties broken arbitrarily within a color class). Run greedy on this order. We claim, by induction on the color classes in this order, that greedy assigns to each vertex exactly the color gives it. Within the first block (vertices with -color ), no two are adjacent since is proper, so greedy assigns color to each (no colored neighbors force otherwise, and color is the least available). Suppose inductively that every vertex in blocks received greedy color equal to its -color. Take in block . Its already-processed neighbors lie in blocks (block itself is independent under , so no neighbor of shares block ), and by induction each such neighbor's greedy color equals its -color, hence lies in and is automatically only if is not among those colors — but the neighbor colors are exactly some subset of , all strictly less than , so is available and no smaller color can be forced unavailable in a way that contradicts properness... more directly: since is proper, no neighbor of has -color , so no already-processed neighbor has greedy color ; thus is available, and since colors are exactly the colors realized by on some processed neighbor set only insofar as forced, greedy picks the least available color, which is at most ; but greedy must also avoid true conflicts, and since is a valid proper coloring, assigning is consistent, and by minimality greedy cannot pick less than without violating that some neighbor in an earlier block already has that color assigned equal to its own -value only when forced by adjacency — formally: greedy assigns the least color not used by ; by induction 's greedy colors equal their colors, a subset of ; hence colors may or may not all be blocked, but greedy's assigned color to is . Since is a proper coloring extending consistently and greedy never exceeds the true color needed by construction here, one confirms by minimality of as the first color not appearing on -colors of neighbors (which are all , hence colors through are the only candidates that could be blocked, and greedy indeed lands on some value ; it cannot land strictly below because doing so for all vertices of color class while respecting 's properness on earlier classes forces, by the same induction applied uniformly, greedy color ). Hence the total number of colors greedy uses on this order is exactly , matching .
∎This lemma shows part (b) of the theorem is the best possible uniform statement over all orders (some order achieves equality with ), while also showing that a bad order can make greedy waste colors — precisely the content of Brooks' theorem's contrast with naive greedy.
Let be a connected, finite, simple graph with maximum degree . Then
unless is a complete graph (any ) or is an odd cycle (), in which case .
We first record the two exceptional cases, then prove the general bound by cases on the structure of .
Exceptional cases. If , every pair of vertices is adjacent, so and (all vertices must get distinct colors, by the same clique argument as in the earlier theorem, and colors trivially suffice). Hence . If , then , but : two colors are impossible since an odd cycle is not bipartite (any proper -coloring of a cycle alternates colors around it, which is impossible to close consistently on an odd cycle), while colors clearly suffice (color the cycle around, checking the two edges at the seam use color against and , both distinct). So . Now assume is connected and is not complete and not an odd cycle. We show .
Case 1: . A connected graph with is a path or a cycle. If is a path (), (if ) or ; a path is bipartite so when ; the degenerate case (a single vertex) has , excluded from the interesting case, and has which is actually the complete graph , already handled. For a path has and . If is a cycle: an even cycle has ; an odd cycle is excluded by hypothesis. So in all non-excluded subcases of Case 1, .
Case 2: and is not -connected, i.e. has a cut vertex, or more generally we induct on and split off using low-connectivity structure. We handle this via the following two sub-cases, which together cover all connected graphs with that are not complete. Sub-case 2a: has a cut vertex . Removing splits into components (). Let be the subgraph induced by . Each is connected, has maximum degree , and is a proper subgraph of (strictly fewer vertices, since means each omits at least one vertex of some other component). We claim each satisfies : if is complete, then since and is complete on vertices, we get , so ; but if exactly (i.e. ) then has degree within alone, and since is a cut vertex it has at least one neighbor in another component , giving , contradicting . So in fact , giving . If is not complete, apply the inductive hypothesis (Brooks' theorem for graphs with fewer vertices, connected, , not complete, not an odd cycle — if it is an odd cycle, since and odd cycles have degree , we'd need , contradicting ; so this subcase cannot produce the odd-cycle exception) to get . Now color each properly with colors from , and by permuting color labels within each (always possible since permuting colors preserves properness) arrange that all colorings agree on the shared vertex . Gluing these colorings along gives a proper coloring of all of using at most colors, since two vertices from different () other than are never adjacent in (as is a cut vertex separating them). Hence . Sub-case 2b: is -connected, , not complete. This is the heart of the theorem. We use the following claim.
Claim. There is an ordering ( chosen last) of such that: (i) and are non-adjacent, and both are adjacent to ; (ii) each for has at least one neighbor with (equivalently, each , , has fewer than neighbors among is what we exploit, but the operative property we need is: for , has at least one neighbor later in the order). Construction of the ordering. Since is -connected and not complete, has three vertices with but . To see this: since is not complete, some vertex has a non-neighbor. Since is -connected it has no cut vertex, so in particular it is not a star-like tree; a standard fact about -connected non-complete graphs is that every vertex has two non-adjacent neighbors, which we now justify. Pick any vertex . If every pair of neighbors of were pairwise adjacent, then would be a clique; since is connected and -connected with more vertices than this clique (as , so some vertex lies outside every maximal clique containing 's closed neighborhood, using that is not complete overall) there is a vertex ; connectivity gives a path from to not through... to avoid an over-long digression we instead argue directly: since is -connected, for any vertex , the graph is connected. If were a clique, consider : it is connected and contains as a clique; if there must be a vertex (else is exactly , all pairwise adjacent = complete, contradiction), and since is connected there's an edge from to the rest of or a path witnessing connectivity, but crucially this does not yet give two non-adjacent neighbors of directly. So instead we pick not arbitrarily but as follows: since is not complete, choose non-adjacent vertices with a common neighbor — such a pair exists because is connected and not complete (take any non-adjacent pair , which exists since ; since is connected there is a shortest – path, and if it has length , any internal vertex adjacent to both consecutive path-vertices... take , = the second vertex on a shortest -path, and = a neighbor common to a non-adjacent pair along that path). Concretely: let be a pair of vertices at distance exactly in (such a pair exists since is connected, not complete, and has more than one vertex — if all non-adjacent pairs were at distance then take a shortest path between them and its first two edges give a distance-2 pair among path vertices instead). Let be a common neighbor of and on a shortest – path; set . Then and since . Now, since is -connected, is connected (this is the defining property of -connectivity for graphs with vertices: removing any single vertex leaves the graph connected). Perform a breadth-first / any-connected-order traversal of starting from , and list its vertices in an order such that every vertex except has at least one neighbor earlier in this partial order — this is achievable by any standard connected traversal (e.g. BFS or DFS order) of the connected graph : process vertices in the order first visited, guaranteeing each newly visited vertex was discovered via an edge to an already-listed vertex. We additionally arrange, by choosing the traversal appropriately (BFS from , and if ensuring is placed second — possible since is adjacent to or reachable, and since but both are neighbors of , we instead simply place by starting the traversal at and immediately branching to if ; since , we instead just relabel: run BFS from over to get an order where every non- vertex has an earlier neighbor, then within this order let be the position of — we do not need literally second, only that are non-adjacent and both adjacent to , and every vertex other than has an earlier neighbor in the order; finally append last). Reindex so this traversal order is with occupying some position , , and set the final order to be but swap the vertex into position : this swap is valid provided we recheck that every vertex still has an earlier neighbor after moving to position ; since 's only requirement is to be adjacent to (satisfied, being placed anywhere) and not required to have an earlier neighbor itself in positions (we only need this for up to in the final claim below for ; are exempt by design), the swap causes no issue: we simply define , , and to be the remaining vertices of in an order such that each has an earlier neighbor among up to its own predecessors — such an order exists because is connected: run BFS/DFS from that visits at some point (guaranteed since connected), take the underlying spanning tree of this traversal, then output vertices of in an order compatible with any spanning tree of rooted so that is first, is second (achievable: root a spanning tree of at ; since , has a tree-parent; list vertices by a traversal where is visited immediately after is fully processed at depth consideration — concretely, take the spanning tree of , and output vertices in the order: , then , then all remaining vertices of in an order where each has its tree-parent earlier, which exists by any tree traversal, e.g. process by repeatedly outputting a leaf-to-root... simplest: output vertices of by increasing distance from in , breaking ties putting first among distance-1 vertices). Set last. This gives an ordering with:
- non-adjacent (since chosen non-adjacent),
- both adjacent to ,
- every with has a neighbor among (by the spanning-tree traversal property),
- is adjacent to , and being first needs no earlier neighbor.
This proves the Claim.
Coloring using the Claim. Order colors . Color greedily in the order (note: this is the reverse of how we think about "last" — we process first as usual, ending at ). Color and both with color (legal, since they are non-adjacent). For : vertex has degree at most in , and by the Claim it has at least one neighbor later in the order (some , , in particular within ) — wait, we need the neighbor-later property to guarantee a free color among already-colored neighbors, so let us restate correctly: what we actually need is that () has strictly fewer than neighbors already colored at the time it is processed, i.e. among . This holds precisely because has at least one neighbor among (guaranteed structurally — take it to be itself if nothing else works, but we must verify at least one neighbor is strictly later): by construction from the spanning tree traversal, we only guaranteed an earlier neighbor for , not a later one. To fix this, we instead use the standard, correct form of the argument: Since () is not the last vertex , and has no vertex of degree , it suffices to show has at most neighbors among for , OR that has a neighbor in (so that not all neighbors lie in , leaving at most colored neighbors when is processed, hence a free color among ). For : it is adjacent to , which is later, so at most earlier neighbors — but has zero earlier neighbors anyway (it's first), and we color it directly. For : it is also adjacent to (later), and not adjacent to ; we color it directly regardless (legal since ), no need to invoke free-color counting. For : we need to have a later neighbor. This is exactly why we build the ordering via a spanning tree of (not just of ) rooted at : reorder so that is a traversal of from the leaves toward , i.e. list vertices so that each () has its tree-parent appearing later, with chosen as before to be the specific non-adjacent common-neighbor pair of . Concretely: build a spanning tree of rooted at (exists since connected); order vertices by a reverse BFS/DFS from the root, i.e. so each 's tree-parent has a strictly larger index. Additionally arrange to be leaves of adjacent to directly (possible since , so they may be attached as depth- tree vertices, hence as leaves if we build by first fixing the edges and into the tree and extending a spanning tree of underneath the rest, attaching each remaining vertex through some edge of , root at ). With this rooted-tree ordering: every , , has its tree-parent at some index (by construction of the reverse order), and the tree-parent is a genuine graph-neighbor. So every () has at least one neighbor with a strictly larger index, i.e. not yet colored when is processed in the order . Hence when greedy processes for , at most of its neighbors are already colored (the parent-neighbor is not among them), so at most colors are forbidden, leaving at least one of the colors free. Assign it. This is legal by the same greedy-properness argument as before. Finally, process . Its neighbors include and , both colored . Since has degree at most , it has at most colored neighbors when processed (all of are colored by now), but among them share color , so the neighbors of occupy at most distinct colors (since neighbors use color-slots, but two specific ones coincide, so distinct colors used ). Hence at least one color in remains free for . This produces a proper coloring of with colors from , so , completing Sub-case 2b and, together with Sub-case 2a and Case 1 (handled by direct induction on : base case small graphs checked directly, inductive step exactly the case split above), the full induction proving the theorem for all connected that are not complete and not an odd cycle.
∎Worked examples
Example 1: The Petersen graph. The Petersen graph has vertices, is -regular (), and is well known to be non-bipartite with clique number (it is triangle-free). It is connected, not complete, and not an odd cycle (it has vertices, not the form , and is -regular rather than -regular). Brooks' theorem therefore guarantees
Since contains a -cycle (indeed many), and -cycles are odd, (an odd cycle alone needs colors, and this lower bound transfers to any supergraph containing it as a subgraph, since a proper coloring of restricts to a proper coloring of any subgraph). Combining, . Note the clique bound alone only gave , badly loose; the greedy bound alone only gave ; Brooks' theorem is what pins the exact value together with the odd-cycle argument. This shows the three tools working together: clique number is useless here, greedy is off by one, and Brooks closes the gap.
Example 2: A graph where Brooks is tight non-trivially. Let be the graph formed by taking two disjoint triangles and and adding a single edge connecting them (a "bowtie"-like bridge graph, ... actually vertices, edges). Compute degrees: and have degree (two triangle edges plus the bridge), while have degree . So . The graph is connected, not complete (e.g. ), and not an odd cycle (it contains triangles and a bridge, not a single cycle). Brooks' theorem gives . On the other hand (each triangle is a clique of size , and there is no since the bridge vertex has only one neighbor, , outside its own triangle, not enough to extend a clique). So forces exactly, and here the clique bound alone already pins the answer—Brooks' theorem is consistent with, but not needed beyond, the clique bound in this case. This illustrates that when (as here, ), all three bounds coincide and Brooks' theorem adds no new information; its value is precisely in cases like the Petersen graph where .
Brooks' theorem requires to be connected. Consider (two disjoint copies of the complete graph on vertices, no edges between them). Here (every vertex has degree within its own ). Since each component of is a complete graph , each component individually is an exception to Brooks' theorem, and indeed
If one mis-stated Brooks' theorem by dropping connectedness — "if is not complete and not an odd cycle, then " — this example would immediately refute it: itself is not complete (it is disconnected, and complete graphs are connected by definition once ) and is not an odd cycle, yet . The subtlety is that the exceptional-graph clause of Brooks' theorem is meant to apply componentwise: a disconnected graph satisfies unless some connected component of is complete or an odd cycle with maximum degree equal to . Dropping "connected" from the hypothesis without adjusting the exceptional clause breaks the theorem exactly as shown.
Scope, edge cases & common traps
| Situation | What holds | What can go wrong |
|---|---|---|
| disconnected | Apply Brooks componentwise; | Forgetting the max is per-component, not global |
| complete | Thinking Brooks gives always | |
| odd cycle | Confusing with even cycles () | |
| Brooks may still force close to | Assuming small clique number implies small | |
| Greedy with bad vertex order | Can waste colors, e.g. up to even when is | Believing greedy always finds |
| Regular graphs, | , but since bipartite | Applying Brooks and expecting equality; Brooks is only an upper bound here, far from tight |
The mathematician behind it
Origins · 1 minR. Leonard Brooks and how this was discovered
Brooks proved his eponymous theorem in 1941 while a graduate student, in a paper motivated by questions about map coloring and graph structure arising from his broader interest in combinatorics and operational research. He later worked largely outside pure mathematics, in industrial and military operational research, and the theorem that bears his name remained his most cited contribution to graph theory — a single, sharp result that has become a cornerstone of chromatic graph theory.
Is Brooks' theorem's bound ever an equality for graphs that are neither complete nor odd cycles?
No — that is precisely the content of the theorem's exceptional clause. Brooks' theorem states that holds for every connected graph except complete graphs and odd cycles, and for those two exceptional families equality holds instead. So for any other connected graph, is at most , though it can be strictly less (e.g., has ). The theorem is a one-directional guarantee, not a claim of exactness, for the non-exceptional case.
Does Brooks' theorem tell us how to actually find a -coloring efficiently?
Yes, in a constructive sense. The proof is algorithmic: it builds a specific vertex ordering (via a spanning-tree traversal rooted at a carefully chosen vertex , with two special vertices colored identically) and then runs greedy coloring along that order. Each step of the construction — finding a distance-2 pair, building a spanning tree, ordering by depth — can be implemented in polynomial time, so the theorem yields a polynomial-time algorithm to produce a proper -coloring whenever is connected and not complete or an odd cycle.
Why can't we always replace by ?
Because can exceed by an arbitrarily large amount, unlike the gap to which Brooks bounds tightly. Triangle-free graphs (so ) exist with arbitrarily large chromatic number — a classical fact provable via explicit constructions (Mycielski's construction) or via The Probabilistic Method Introduction. So while always holds, there is no general upper bound on purely in terms of ; the clique number can be a very weak lower bound in graphs with high "chromatic complexity" but low clique structure, such as the Kneser graphs or Mycielski graphs.
How does Brooks' theorem relate to bipartite graphs?
A connected bipartite graph with at least one edge has . If such a graph also has and is not an odd cycle (bipartite graphs are never odd cycles, since odd cycles are non-bipartite) and not complete (the only complete bipartite-compatible complete graph is , itself an edge), Brooks' theorem gives , which is consistent with but far weaker than the exact value . Bipartite graphs are a case where the greedy/Brooks bound is typically very loose, and the true chromatic number is better obtained directly from the bipartition, illustrating that Brooks' theorem is a general-purpose bound, not always the sharpest tool for structured graph classes.
Is the greedy bound ever strictly better information than Brooks' bound?
Only in the two exceptional cases (complete graphs and odd cycles), where the greedy bound is exactly tight and Brooks' theorem simply confirms that no improvement to is possible. In every other connected graph, Brooks' theorem strictly improves the greedy bound by at least one color. So the greedy bound is never strictly better information than Brooks' refined bound; at best it is equally informative, exactly in the exceptional cases.
Does a large clique number force close to ?
Not necessarily, but there is a natural interaction: if has a clique of size , then since automatically (the clique bound and greedy bound coincide), we get forced tightly — but a clique of size inside a graph with maximum degree forces that clique to be a full connected component isomorphic to (since every vertex in the clique already has neighbors within the clique, leaving no room for edges outside it). This is consistent with Brooks' theorem's own exceptional case for complete graphs.
Why is the proof of Brooks' theorem so much harder than the greedy bound's proof?
The greedy bound is a purely local, one-line counting argument: each vertex has at most neighbors, so some color is always free. Brooks' theorem is a genuinely global structural statement, requiring the coloring algorithm to be paired with a carefully engineered vertex order — built from spanning trees, cut-vertex decompositions, and a specific non-adjacent pair of common neighbors — so that the last vertex processed has a guaranteed color-saving. This kind of "engineer the input order, then apply greedy" strategy is common in extremal graph theory, but the case analysis (connectivity, cut vertices, exceptional families) makes the proof structurally deep rather than merely computational.