21 chapters · 63 sections
- Chapter I
Satisfiability
The mother problem. Cook (1971) proved SAT NP-complete; Karp (1972) fanned out from it to twenty more problems that look nothing alike but turn out to be the same hardness in disguise.
- Chapter II
0-1 Integer Programming
- Chapter III
Clique
- Chapter IV
Set Packing
Pick as many sets as you can without two of them sharing an element. The dual of set cover, and the problem behind every "you can't double-book this resource" rule in the world.
- Chapter V
Vertex Cover
Pick the smallest set of vertices that touches every edge. Karp's "Node Cover" — the cleanest demonstration that NP-completeness can be cheap to recognize.
- Chapter VI
Set Cover
Cover every element of a universe using as few sets as possible. The greedy ln(n)-approximation is one of the most-used algorithms in industry that nobody calls by its name.
- Chapter VII
Feedback Node Set
- Chapter VIII
Feedback Arc Set
Same idea, but you delete edges instead of vertices. Every "rank these things consistently" problem in the world reduces to it.
- Chapter IX
Directed Hamilton Circuit
Find a cycle that visits every vertex exactly once. The skeleton inside every traveling-salesman variant.
- Chapter X
Undirected Hamilton Circuit
Drop the directions. Still NP-complete. The undirected case has more structural lemmas (Dirac, Ore) but no general polynomial test.
- Chapter XI
3-Satisfiability
Restrict SAT to clauses of at most three literals. Still NP-complete. The standard starting point for almost every reduction in the literature.
- Chapter XII
Chromatic Number
Color the vertices so adjacent vertices differ; use as few colors as possible. The graph problem behind compiler register allocation.
- Chapter XIII
Clique Cover
Partition the vertices of a graph into cliques, using as few as possible. The same as coloring the complement graph.
- Chapter XIV
Exact Cover
Cover the universe so every element is covered exactly once by your chosen sets. The problem under Sudoku, polyomino tiling, and Knuth's Dancing Links.
- Chapter XV
Hitting Set
Find the smallest set that intersects ("hits") every set in a family. The dual of set cover, but framed from the elements' side.
- Chapter XVI
Steiner Tree
Connect a chosen subset of vertices with the cheapest tree. Other vertices may be used as helpful waypoints — that is the Steiner trick.
- Chapter XVII
3-Dimensional Matching
Bipartite matching is in P. Add a third side and it becomes NP-complete — one of complexity theory's cleanest dimensional cliffs.
- Chapter XVIII
Knapsack
Pack the most value into a fixed-capacity bag. The textbook NP-complete problem with a famously fast pseudo-polynomial DP.
- Chapter XIX
Job Sequencing
Schedule jobs with deadlines and penalties on a single machine. Ada was designed for problems with deadlines that matter.
- Chapter XX
Partition
Split a multiset of integers into two subsets with equal sums. Knapsack's special case, surprisingly hard, surprisingly close to easy.
- Chapter XXI
Max Cut
Partition the vertices into two groups to maximize the edges between the groups. The crown jewel of approximation algorithms — and the canonical benchmark for quantum optimization.