Soluții Reduceri Polinomiale
1. $ {\rm Partioning} \le_p {\rm SubsetSum}$.
Input pentru $ {\rm Partioning}$: o listă de numere $ A = [a_1, \dots, a_n]$.
Output pentru $ {\rm Partioning}$: $ {\rm TRUE/FALSE }$ dacă există o multime $ S \subseteq \{1, 2, \dots, n\}$ astfel incat $ \sum_{i\in S} a_i = \sum_{i\notin S} a_i$.
Input pentru $ {\rm SubsetSum}$: o listă de numere $ B = [b_1, \dots, b_m]$ si un numar $ k \in \mathbb{N}$.
Output pentru $ {\rm SubsetSum}$: $ {\rm TRUE/FALSE }$ dacă există o multime $ S \subseteq \{1, 2, \dots m\}$ astfel incat $ \sum_{i\in S} b_i = k$.
Gasim o transformare computabila in timp polinomial $ t : A \mapsto (B, k)$ astfel incat $ {\rm Partitioning}(A) = {\rm TRUE} \iff {\rm SubsetSum}(B, k) = {\rm TRUE}$:
$$ t(A) = \left(B = A, k = {\rm sum}(A) / 2\right) \ \ \ (B = A \text{ eventual o copiere in } O(n), \text{ calculul lui } k \text{ in } O(n))$$
$ (\Longrightarrow)$ $$ {\rm Partitioning}(A) = {\rm TRUE} \Rightarrow \exists S: \sum_{i\in S} a_i = \sum_{i\notin S} a_i. \ \ \ \ \
\sum_{i\in S} a_i + \sum_{i\notin S} a_i = \sum_i a_i = {\rm sum}(A) \Rightarrow \sum_{i\in S} a_i = \frac{{\rm sum}(a)}2 \\
B = A \Rightarrow \sum_{i\in S} b_i = \frac{{\rm sum}(B)}2 = k \Rightarrow {\rm SubsetSum}(B, k) = {\rm TRUE}$$
$ (\Longleftarrow)$ $$ {\rm SubsetSum}(B, k) = {\rm TRUE} \Rightarrow \exists S: \sum_{i\in S} b_i = k \Rightarrow \sum_{i\notin S} b_i = \sum_i b_i - \sum_{i\in S} b_i = {\rm sum}(B) - k \\ B = A, k = \frac{{\rm sum}(A)}2 \Rightarrow \sum_{i\notin S} a_i = {\rm sum}(A) - \frac{{\rm sum}(A)}2 = {\rm sum}(A) / 2\Rightarrow \\ \sum_{i\in S} a_i = \sum_{i\notin S} a_i = {\rm sum}(A) / 2 \Rightarrow {\rm Partitioning}(A) = {\rm TRUE}$$
2. $ {\rm SubsetSum} \le_p {\rm Partioning}$
Gasim o transformare computabila in timp polinomial $ t : (B, k) \mapsto A$ astfel incat $ {\rm SubsetSum}(B, k) = {\rm TRUE} \iff {\rm Partitioning}(A) = {\rm TRUE}$:
$$ t(B, k): A = B \cup \{a_{m+1} = 2k - {\rm sum}(B)\} \ \ \ (\text{un calcul in } O(m) \text{ și o adăugare/copiere în } O(m)) $$
$ (\Longrightarrow)$ $$ {\rm SubsetSum}(B, k) = {\rm TRUE} \Rightarrow \exists S \subseteq \{1, \dots m\}: \sum_{i\in S} b_i = k \Rightarrow \\ \sum_{i\notin S} a_i = \left(\sum_i b_i - \sum_{i\in S} b_i \right) + (2k - {\rm sum}(B)) = \left({\rm sum}(B) - k\right) + 2k - {\rm sum}(B) = -k + 2k = k \\
\sum_{i\in S} a_i = \sum_{i\in S} b_i = k \Rightarrow \sum_{i\in S} a_i = \sum_{i\notin S} a_i = k \Rightarrow {\rm SubsetSum}(A) = {\rm TRUE} $$
$ (\Longleftarrow)$ $$ {\rm Partitioning}(A) = {\rm TRUE} \Rightarrow \exists S \subseteq \{1, \dots m, m + 1\}: \sum_{i\in S} a_i = \sum_{i\notin S} = {\rm sum}(A) / 2 = ({\rm sum}(B) + a_{m+1}) / 2 = 2k/2 = k. \\ \text{Daca } m+1 \notin S, \text{ alegem } S' = S, \text{ altfel alegem } S' = \{1, \dots, m\} \setminus S = \{1, \dots, m, m+1 \} \setminus S \\ \text{Atunci, } m+1 \notin S', \sum_{i\in S'} b_i = \sum_{i\in S'} a_i = \text{ fie } \sum_{i\in S} a_i, \text{ fie } \sum_{i\notin S} a_i = k \Rightarrow {\rm SubsetSum}(B, k) = {\rm TRUE} $$
3. $ {\rm HamiltonianCycle} \le_p {\rm HamiltonianPath}$
Facem o transformare de la un graf nevid $ G = (V, E)$ (graful in care se cauta un ciclu hamiltonian) la un graf nevid $ G' = (V', E')$ (graful in care se cauta un drum hamiltonian). Putem sa impartim un nod u in doua noduri s si t astfel incat toate muchiile care ies din u ies din s si toate care intra in u intra in t:
$$ t(G) = G',\ V' = V \setminus \{u\} \cup \{s, t\}, u \in V, s, t \notin V,\ (x, y) \in E' \iff ((x, y) \in E \land x \ne u \land y \ne u) \lor (x = s \land (u, y) \in E) \lor (y = t \land (x, u) \in E) \\ (\text{muchiile care pleaca din $ u$ in $ G$ pleaca din $ s$ in $ G'$, cele care intra in $ u$ in G intra in $ t$ in $ G'$, in rest, $ G'$ are toate muchiile din $ G$ care nu il au pe $ u$ la niciun capat})$$
$ (\Longrightarrow)$ $$ {\rm HamiltonCycle}(G) = {\rm TRUE} \Rightarrow \exists\ L = [y_1, y_2, \dots, y_n]:\ n = |V|,\ y_i \in V\ \ \ \forall (1\leq i\leq n),\ (y_i, y_{i+1}) \in E\ \ \ \forall (1\leq i < n),\ (y_n, y_1) \in E,\ y_i \ne y_j\ \ \forall i \ne j \\ L \text{ fiind un ciclu, putem sa-l incepem din orice nod, deci vom renumerota nodurile astfel incat } y_1 = u \Rightarrow \\ [s, y_2, y_3 \dots, y_{n-1}, t] \text{ este un drum hamiltonian in } G' \Rightarrow {\rm HamiltonianPath}(G') = {\rm TRUE} $$
$ (\Longleftarrow)$ $$ {\rm HamiltonianPath}(G') = {\rm TRUE} \Rightarrow \exists\ L' = [y_1', y_2', \dots, y_{n+1}']:\ n = |V|,\ y_i' \in V'\ \ \ \forall (1\leq i\leq n + 1),\ (y_i', y_{i+1}') \in E'\ \ \ \forall (1\leq i < n + 1),\ y_i' \ne y_j'\ \ \forall i \ne j \Rightarrow \\ s, t \in L', \text{ dar } {\rm indegree}(s) = 0, {\rm outdegree}(t) = 0 \Rightarrow L' \text{ incepe cu } s \text{ si se termina cu } t \Rightarrow L' = [s, y_2', \dots, y_n', t]. \\ \text{ Atunci }, [u, y_2', \dots, y_n'] \text{ este un ciclu hamiltonian in } G \text{ deoarece } (s, y_2') \in E' \iff (u, y_2') \in E \text{ si } (y_n', t) \in E' \iff (y_n', u) \in E \Rightarrow \\ {\rm HamiltonialCycle}(G') = {\rm TRUE} $$
4. $ {\rm GraphUnreachability} \le_p {\rm 2SAT}$ unde $ {\rm GraphUnreachability}$ intreaba daca NU exista nici un drum intre doua noduri $ s$ si $ t$ intr-un graf $ G$
Pentru graful $ G = (V, E)$, construim formula 2SAT care are cate o clauza de forma $ (\overline{x_u} \lor x_v)$ pentru fiecare muchie $ (u, v) \in E$, clauzele $ (x_s \lor y) \land (x_s \lor \overline{y})$ (echivalent cu $ x_s$) si clauzele $ (\overline{x_t} \lor y) \land (\overline{x_t} \lor \overline{y})$ (echivalent cu $ \overline{x_t}$). Valoarea unui literal $ x_u$ reprezinta daca nodul $ u$ este accesibil din $ s$, iar expresiile $ \overline{x_u} \lor x_v$ sunt echivalente cu implicatii logice “daca u este accesibil din s, v este accesibil din s”
$$ t : ((V, E), s, t) \mapsto \phi = (x_s \lor y) \land (x_s \lor \overline{y}) \land \left(\bigwedge_{(u, v)\in E}(\overline{x_u} \lor x_v)\right) \land (\overline{x_t} \lor y) \land (\overline{x_t} \lor \overline{y})$$
$ (\Longrightarrow)$
$$ {\rm GraphUnreachability}(G, s, t) = {\rm TRUE} \Rightarrow \nexists L \text{ drum in } G: L \text{ incepe in } s \text{ si se termina in } t \Rightarrow \\ \forall L_s = [s, \dots, u] \text{ drum in } G, (u, t) \notin E\ (\text{deoarece altfel } L_s \cup [(u, t)] \text{ ar fi un drum care incepe in $ s$ si se termina in $ t$}) \Rightarrow \\ \text{Fie interpretarea } I = \{x_u = 1\ |\ u \text{ este accesibil din } s\} \cup \{x_u = 0\ |\ u \text{ nu este accesibil din } s\} \cup \{y = 0\}. \\ \text{Atunci }, (x_s \lor y) \land (x_s \lor \overline{y}) = 1, (\overline{x_t} \lor y) \land (\overline{x_t} \lor \overline{y}) = 1, \forall (u \text{ accesibil din }s) (v \in V, (u, v) \in E), v \text{ este accesibil din } s, v\ne t,\ (\overline{x_u} \lor x_v) = 1, \\ \forall (u \text{ inaccesibil din }s)(v \in V, (u, v) \in E), (\overline{x_u} \lor x_v) = 1 \Rightarrow I \vDash \phi \Rightarrow {\rm 2SAT}(\phi) = {\rm TRUE}$$
$ (\Longleftarrow)$
$$ {\rm 2SAT}(\phi) = {\rm TRUE} \Rightarrow \exists\text{interpretare }I: I\vDash\phi \Rightarrow (x_s = 1) \in I, (x_t = 0)\in I. \\ \forall (u \in V, u \text{ accesibil din }s), \exists L = [s, w_1, w_2 \dots, w_k, u] \text{ drum in } G \Rightarrow \text{ clauzele } (\overline{x_s} \lor x_{w_1}) \land (\overline{x_{w_1}} \lor x_{w_2}) \land \dots \land (\overline{x_{w_k}} \lor x_u) \text{ apar in } \phi \Rightarrow (x_u = 1) \in I \\ (x_t = 0) \in I \Rightarrow t \text{ nu este accesibil din } s, \text{ deoarece altfel } (x_t = 1) \in I \Rightarrow {\rm GraphUnreachability}(G, s, t) = {\rm TRUE}$$
5. $ {\rm 3SAT} \le_p {\rm kVertexCover}$
Stim de la curs ca $ {\rm 3SAT} \le_p {\rm kClique}$.
De asemenea, tot de la curs stim ca $ {\rm kClique} \le_p {\rm kVertexCover}$
Din tranzitivitatea relatiei de reducere obtinem ca $ {\rm 3SAT} \le_p {\rm kVertexCover}$.