NP-полнота задачи о раскраске графа — различия между версиями
Alant (обсуждение | вклад) |
Alant (обсуждение | вклад) |
||
Строка 11: | Строка 11: | ||
Сведем задачу 3CNFSAT к данной.<br/> | Сведем задачу 3CNFSAT к данной.<br/> | ||
Пусть дана <math> \varphi = (a_1 \lor b_1 \lor c_1) \land (a_2 \lor b_2 \lor c_2) \land ... \land (a_m \lor b_m \lor c_m) </math>, где <math>a_i</math>, <math>b_i</math> и <math>c_i</math> - переменные или их отрицания (возможно, с повторениями). Сами переменные будем обозначать <math> \{x_i\}_{i=1}^n </math>.<br/> Заметим следующие тривиальные факты, которые будут использованы при построении графа: | Пусть дана <math> \varphi = (a_1 \lor b_1 \lor c_1) \land (a_2 \lor b_2 \lor c_2) \land ... \land (a_m \lor b_m \lor c_m) </math>, где <math>a_i</math>, <math>b_i</math> и <math>c_i</math> - переменные или их отрицания (возможно, с повторениями). Сами переменные будем обозначать <math> \{x_i\}_{i=1}^n </math>.<br/> Заметим следующие тривиальные факты, которые будут использованы при построении графа: | ||
− | + | # Ровно одно выражение из <math> \{x_i, \lnot {x_i}\} </math> истинно; | |
− | + | # <math> \varphi \in 3CNFSAT \Leftrightarrow \forall {j} (a_j \lor b_j \lor c_j) = 1 </math> | |
Построим множества V и E будущего графа следущим образом: | Построим множества V и E будущего графа следущим образом: | ||
* <math> V = \{c_j\}_{j=0}^m </math>; | * <math> V = \{c_j\}_{j=0}^m </math>; | ||
* <math> E = \{<c_i, c_j>\}_{i,j=0, i \ne j}^m </math>; | * <math> E = \{<c_i, c_j>\}_{i,j=0, i \ne j}^m </math>; | ||
Будем интерпретировать <math> c_i </math> как цвет, причем <math>c_0</math> - цвет, обозначающий истину. | Будем интерпретировать <math> c_i </math> как цвет, причем <math>c_0</math> - цвет, обозначающий истину. | ||
− | * <math> \forall i \in \{1 .. n\} </math> добавим в V вершины <math> v_i, \tilde{v_i} | + | * <math> \forall i \in \{1 .. n\} </math> добавим в V вершины <math> v_i, \tilde{v_i} </math>, отвечающие <math> x_i </math> и <math> \lnot {x_i} </math> соответственно; |
+ | * <math> \forall i \in \{1 .. n\} </math> соединим каждую вершину из <math> \{v_i, \tilde{v_i}\} </math> со всеми <math> c_j </math>, кроме <math> c_0 </math> и <math> c_i </math>. Этим мы обеспечили выполнение первого условия из приведенных выше.<br/> | ||
+ | Осталось сделать так, чтобы возможность сделать истинной каждую скобку соответствовала необходимости покрасить хотя бы одну из вершин, соответствующих переменным в ней, в цвет <math> c_0 </math>. |
Версия 23:49, 9 марта 2010
Содержание
Формулировка задачи
Даны граф
и число . Нужно проверить, правда ли, что можно раскрасить вершины графа в цветов так, чтобы любые две вершины, соединённые ребром, имели разные цвета.Утверждение
Сформулированная выше задача NP-полна.
Доказательство
Доказательство принадлежности задачи классу NP
Сертификатом для решения данной задачи будет последовательность
, где , а обозначает цвет i-ой вершины. Проверку корректности такого сертификата легко осуществить за полиномиальное время, например, перебором всех пар вершин и проверкой того, что в случае, когда они соединены ребром, они имеют разные цвета, лежащие на отрезке .Доказательство принадлежности задачи классу NPH
Сведем задачу 3CNFSAT к данной.
Пусть дана , где , и - переменные или их отрицания (возможно, с повторениями). Сами переменные будем обозначать .
Заметим следующие тривиальные факты, которые будут использованы при построении графа:
- Ровно одно выражение из истинно;
Построим множества V и E будущего графа следущим образом:
- ;
- ;
Будем интерпретировать
как цвет, причем - цвет, обозначающий истину.- добавим в V вершины , отвечающие и соответственно;
-
Осталось сделать так, чтобы возможность сделать истинной каждую скобку соответствовала необходимости покрасить хотя бы одну из вершин, соответствующих переменным в ней, в цвет
.