|
54 | 54 | "BinPacking": [Bin Packing], |
55 | 55 | "ClosestVectorProblem": [Closest Vector Problem], |
56 | 56 | "SubsetSum": [Subset Sum], |
| 57 | + "MinimumFeedbackVertexSet": [Minimum Feedback Vertex Set], |
57 | 58 | ) |
58 | 59 |
|
59 | 60 | // Definition label: "def:<ProblemName>" — each definition block must have a matching label |
@@ -537,6 +538,37 @@ caption: [Path $P_5$ with maximal IS $S = {v_1, v_3}$ (blue, $w(S) = 2$). $S$ is |
537 | 538 | ) <fig:path-maximal-is> |
538 | 539 | ] |
539 | 540 |
|
| 541 | +#problem-def("MinimumFeedbackVertexSet")[ |
| 542 | + Given a directed graph $G = (V, A)$ with vertex weights $w: V -> RR$, find $S subset.eq V$ minimizing $sum_(v in S) w(v)$ such that the induced subgraph $G[V backslash S]$ is a directed acyclic graph (DAG). |
| 543 | +][ |
| 544 | +One of Karp's 21 NP-complete problems ("Feedback Node Set") @karp1972. Applications include deadlock detection in operating systems, loop breaking in circuit design, and Bayesian network structure learning. The directed version is strictly harder than undirected FVS: the best known exact algorithm runs in $O^*(1.9977^n)$ @razgon2007, compared to $O^*(1.7548^n)$ for undirected graphs. An $O(log n dot log log n)$-approximation exists @even1998. |
| 545 | + |
| 546 | +*Example.* Consider the directed graph $G$ with $n = 5$ vertices, $|A| = 7$ arcs, and unit weights. The arcs form two overlapping directed cycles: $C_1 = v_0 -> v_1 -> v_2 -> v_0$ and $C_2 = v_0 -> v_3 -> v_4 -> v_1$. The set $S = {v_0}$ with $w(S) = 1$ is a minimum feedback vertex set: removing $v_0$ breaks both cycles, leaving a DAG with topological order $(v_3, v_4, v_1, v_2)$. No 0-vertex set suffices since $C_1$ and $C_2$ overlap only at $v_0$ and $v_1$, and removing $v_1$ alone leaves $C_1' = v_0 -> v_3 -> v_4 -> v_1 -> v_2 -> v_0$. |
| 547 | + |
| 548 | +#figure({ |
| 549 | + // Directed graph: 5 vertices, 7 arcs, two overlapping cycles |
| 550 | + let verts = ((0, 1), (2, 1), (1, 0), (-0.5, -0.2), (0.8, -0.5)) |
| 551 | + let arcs = ((0, 1), (1, 2), (2, 0), (0, 3), (3, 4), (4, 1), (2, 4)) |
| 552 | + let highlights = (0,) // FVS = {v_0} |
| 553 | + canvas(length: 1cm, { |
| 554 | + // Draw directed arcs with arrows |
| 555 | + for (u, v) in arcs { |
| 556 | + draw.line(verts.at(u), verts.at(v), |
| 557 | + stroke: 1pt + black, |
| 558 | + mark: (end: "straight", scale: 0.4)) |
| 559 | + } |
| 560 | + // Draw nodes on top |
| 561 | + for (k, pos) in verts.enumerate() { |
| 562 | + let s = highlights.contains(k) |
| 563 | + g-node(pos, name: "v" + str(k), |
| 564 | + fill: if s { graph-colors.at(0) } else { white }, |
| 565 | + label: if s { text(fill: white)[$v_#k$] } else { [$v_#k$] }) |
| 566 | + } |
| 567 | + }) |
| 568 | +}, |
| 569 | +caption: [A directed graph with FVS $S = {v_0}$ (blue, $w(S) = 1$). Removing $v_0$ breaks both directed cycles $v_0 -> v_1 -> v_2 -> v_0$ and $v_0 -> v_3 -> v_4 -> v_1$, leaving a DAG.], |
| 570 | +) <fig:fvs-example> |
| 571 | +] |
540 | 572 |
|
541 | 573 | == Set Problems |
542 | 574 |
|
|
0 commit comments