|
51 | 51 | "BicliqueCover": [Biclique Cover], |
52 | 52 | "BinPacking": [Bin Packing], |
53 | 53 | "ClosestVectorProblem": [Closest Vector Problem], |
| 54 | + "SteinerTree": [Steiner Tree], |
54 | 55 | ) |
55 | 56 |
|
56 | 57 | // Definition label: "def:<ProblemName>" — each definition block must have a matching label |
@@ -455,6 +456,45 @@ One of the most intensely studied NP-hard problems, with applications in logisti |
455 | 456 | caption: [Complete graph $K_4$ with weighted edges. The optimal tour $v_0 -> v_1 -> v_2 -> v_3 -> v_0$ (blue edges) has cost 6.], |
456 | 457 | ) <fig:k4-tsp> |
457 | 458 | ] |
| 459 | +#problem-def("SteinerTree")[ |
| 460 | + Given an undirected graph $G = (V, E)$ with edge weights $w: E -> RR_(>= 0)$ and a set of terminal vertices $T subset.eq V$ with $|T| >= 2$, find a tree $S = (V_S, E_S)$ in $G$ such that $T subset.eq V_S$, minimizing $sum_(e in E_S) w(e)$. Vertices in $V_S backslash T$ are called _Steiner vertices_. |
| 461 | +][ |
| 462 | +One of Karp's 21 NP-complete problems @karp1972, foundational in network design with applications in telecommunications backbone routing, VLSI chip interconnect, pipeline planning, and phylogenetic tree construction. When $T = V$, the problem reduces to the minimum spanning tree (polynomial). The NP-hardness arises from choosing which Steiner vertices to include. |
| 463 | + |
| 464 | +The best known exact algorithm runs in $O^*(3^(|T|) dot n + 2^(|T|) dot n^2)$ time via Dreyfus--Wagner dynamic programming over terminal subsets @dreyfuswagner1971. Byrka _et al._ achieved a $ln(4) + epsilon approx 1.39$-approximation @byrka2013; the classic 2-approximation uses the minimum spanning tree of the terminal distance graph. |
| 465 | + |
| 466 | +*Example.* Consider $G$ with $n = 5$ vertices, $m = 7$ edges, and terminals $T = {v_0, v_2, v_4}$. The optimal Steiner tree uses edges ${(v_0, v_1), (v_1, v_2), (v_1, v_3), (v_3, v_4)}$ with Steiner vertices ${v_1, v_3}$ acting as relay points. The total cost is $w(v_0, v_1) + w(v_1, v_2) + w(v_1, v_3) + w(v_3, v_4) = 2 + 2 + 1 + 1 = 6$. Note the only direct terminal--terminal edge $(v_2, v_4)$ has weight 6, equaling the entire Steiner tree cost. |
| 467 | + |
| 468 | +#figure({ |
| 469 | + // Layout: v0 top-left, v1 top-center, v2 top-right, v3 bottom-center, v4 bottom-right |
| 470 | + let verts = ((0, 1.2), (1.2, 1.2), (2.4, 1.2), (1.2, 0), (2.4, 0)) |
| 471 | + let all-edges = ((0,1),(0,3),(1,2),(1,3),(2,3),(2,4),(3,4)) |
| 472 | + let tree-edges = ((0,1),(1,2),(1,3),(3,4)) |
| 473 | + let weights = ("2", "5", "2", "1", "5", "6", "1") |
| 474 | + let terminals = (0, 2, 4) |
| 475 | + canvas(length: 1cm, { |
| 476 | + for (idx, (u, v)) in all-edges.enumerate() { |
| 477 | + let on-tree = tree-edges.any(t => (t.at(0) == u and t.at(1) == v) or (t.at(0) == v and t.at(1) == u)) |
| 478 | + g-edge(verts.at(u), verts.at(v), |
| 479 | + stroke: if on-tree { 2pt + graph-colors.at(0) } else { 1pt + luma(200) }) |
| 480 | + let mx = (verts.at(u).at(0) + verts.at(v).at(0)) / 2 |
| 481 | + let my = (verts.at(u).at(1) + verts.at(v).at(1)) / 2 |
| 482 | + let dx = if u == 0 and v == 3 { -0.3 } else if u == 2 and v == 3 { 0.3 } else { 0 } |
| 483 | + let dy = if u == 0 and v == 1 { 0.2 } else if u == 1 and v == 2 { 0.2 } else if u == 2 and v == 4 { 0.3 } else { 0 } |
| 484 | + draw.content((mx + dx, my + dy), text(7pt, fill: luma(80))[#weights.at(idx)]) |
| 485 | + } |
| 486 | + for (k, pos) in verts.enumerate() { |
| 487 | + let is-terminal = terminals.any(t => t == k) |
| 488 | + g-node(pos, name: "v" + str(k), |
| 489 | + fill: if is-terminal { graph-colors.at(0) } else { white }, |
| 490 | + stroke: if is-terminal { none } else { 1pt + graph-colors.at(0) }, |
| 491 | + label: text(fill: if is-terminal { white } else { black })[$v_#k$]) |
| 492 | + } |
| 493 | + }) |
| 494 | +}, |
| 495 | +caption: [Steiner tree on 5 vertices with terminals $T = {v_0, v_2, v_4}$ (filled blue). Steiner vertices $v_1, v_3$ (outlined) relay connections. Blue edges form the optimal tree with cost 6.], |
| 496 | +) <fig:steiner-tree> |
| 497 | +] |
458 | 498 | #problem-def("MaximumClique")[ |
459 | 499 | Given $G = (V, E)$, find $K subset.eq V$ maximizing $|K|$ such that all pairs in $K$ are adjacent: $forall u, v in K: (u, v) in E$. Equivalent to MIS on the complement graph $overline(G)$. |
460 | 500 | ][ |
|
0 commit comments