<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Songx</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Songx"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Songx"/>
		<updated>2026-04-27T06:00:26Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=2SAT&amp;diff=71895</id>
		<title>2SAT</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=2SAT&amp;diff=71895"/>
				<updated>2019-10-22T10:09:09Z</updated>
		
		<summary type="html">&lt;p&gt;Songx: /* Первый пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition = &amp;lt;b&amp;gt;&amp;lt;tex&amp;gt;\mathrm {2SAT}&amp;lt;/tex&amp;gt;&amp;lt;/b&amp;gt; (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой [[КНФ|КНФ]] функции, записанной в виде [[Специальные_формы_КНФ|2-КНФ (КНФ Крома)]], таким образом, чтобы результат данной функции был равен &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм решения ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим любой дизъюнкт функции: &amp;lt;tex&amp;gt; a \vee b &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Несложно заметить, что это равнозначно записи &amp;lt;tex&amp;gt;(\overline a \to b \wedge \overline b \to a) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим [[Основные_определения_теории_графов|ориентированный граф]], где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: &amp;lt;tex&amp;gt;\overline a \to b &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \overline b \to a &amp;lt;/tex&amp;gt; для каждого дизъюнкта функции &amp;lt;tex&amp;gt; a \vee b &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Для того, чтобы данная задача &amp;lt;tex&amp;gt;\mathrm {2SAT}&amp;lt;/tex&amp;gt; имела решение, необходимо и достаточно, чтобы для любой переменной &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; из вершины &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; нельзя достичь &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt; и из вершины &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt; нельзя достичь &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; одновременно. &amp;lt;tex&amp;gt;(\overline x \to x) \wedge (x \to \overline x) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;(\Rightarrow)&amp;lt;/tex&amp;gt;Докажем достаточность: Пусть &amp;lt;tex&amp;gt;\mathrm {2SAT}&amp;lt;/tex&amp;gt;  имеет решение. Докажем, что не может быть такого, чтобы для любой переменной &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; из вершины &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; можно достичь &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt; и из вершины &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt; можно достичь &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; одновременно. &amp;lt;tex&amp;gt;((\overline x \to x) \wedge (x \to \overline x)) &amp;lt;/tex&amp;gt;. Тогда чтобы из &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt; достичь &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (\overline x \to x &amp;lt;/tex&amp;gt; было верным), &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; должен быть равен &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;. С другой стороны для того, чтобы из &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; достичь &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (x \to \overline x &amp;lt;/tex&amp;gt; было верным), &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; должен быть равен 0. Отсюда следует противоречие.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(\Leftarrow)&amp;lt;/tex&amp;gt;Докажем необходимость: Пусть для любой переменной &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; из вершины &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; нельзя достичь &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt; и из вершины &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt; нельзя достичь &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; одновременно. Докажем, что этого достаточно, чтобы &amp;lt;tex&amp;gt;\mathrm {2SAT}&amp;lt;/tex&amp;gt;  имело решение. Пусть из &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt; можно достичь &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;, но из вершины &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; нельзя достичь &amp;lt;tex&amp;gt; \overline x &amp;lt;/tex&amp;gt;. Докажем, что из &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; не достижимо такой &amp;lt;tex&amp;gt; y &amp;lt;/tex&amp;gt;, что из &amp;lt;tex&amp;gt; y &amp;lt;/tex&amp;gt; достижимо &amp;lt;tex&amp;gt; \overline y &amp;lt;/tex&amp;gt;. (т.е. &amp;lt;tex&amp;gt; x \to y \to \overline y\, (x = 1, y = 0)) &amp;lt;/tex&amp;gt;. Если из &amp;lt;tex&amp;gt; x \to y &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; \overline x \vee y &amp;lt;/tex&amp;gt;, отсюда следует &amp;lt;tex&amp;gt; \overline y \to \overline x &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; x \to y \to \overline y \to \overline x &amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt; x \to \overline x &amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем собрать весь алгоритм воедино:&lt;br /&gt;
&lt;br /&gt;
#Построим граф импликаций. &lt;br /&gt;
#&amp;lt;i&amp;gt;Найдём в этом графе [[Отношение_связности,_компоненты_связности#Сильная связность | компоненты сильной связности]] за время &amp;lt;tex&amp;gt;O(N + M)&amp;lt;/tex&amp;gt;&amp;lt;/i&amp;gt;, где &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; — количество вершин в графе (удвоенное количество переменных), а &amp;lt;tex&amp;gt; M &amp;lt;/tex&amp;gt; — количество ребер графа (удвоенное количество дизъюнктов).&lt;br /&gt;
#Пусть &amp;lt;tex&amp;gt;comp[v]&amp;lt;/tex&amp;gt; — это номер компоненты сильной связности, которой принадлежит вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Проверим, что для каждой переменной &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\overline x&amp;lt;/tex&amp;gt; лежат в разных компонентах, т.е. &amp;lt;tex&amp;gt;comp[x] \ne comp[\overline x]&amp;lt;/tex&amp;gt;. Если это условие не выполняется, то вернуть &amp;lt;i&amp;gt;решение не существует&amp;lt;/i&amp;gt;. &lt;br /&gt;
#Если &amp;lt;tex&amp;gt;comp[x] &amp;gt; comp[\overline x]&amp;lt;/tex&amp;gt;, то переменной &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; выбираем значение &amp;lt;tex&amp;gt; \mathtt {true}&amp;lt;/tex&amp;gt;, иначе — &amp;lt;tex&amp;gt; \mathtt {false}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Компоненты сильной связности найдем за &amp;lt;tex&amp;gt;O(N + M)&amp;lt;/tex&amp;gt;, затем проверим каждую из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; переменных за &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;. Следовательно асимптотика &amp;lt;tex&amp;gt;O(N + M)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примеры решения 2SAT  == &lt;br /&gt;
=== Первый пример ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим следующую функцию: &amp;lt;tex&amp;gt; (a \vee b) \wedge &lt;br /&gt;
(a \vee c) \wedge&lt;br /&gt;
(\overline b \vee c) \wedge&lt;br /&gt;
(\overline b \vee a) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная функция эквивалентна функции &lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\overline a \to b \wedge&lt;br /&gt;
\overline b \to a \wedge&lt;br /&gt;
\overline a \to c \wedge&lt;br /&gt;
\overline c \to a \wedge&lt;br /&gt;
b \to c \wedge&lt;br /&gt;
\overline c \to \overline b \wedge&lt;br /&gt;
\overline a \to \overline b \wedge&lt;br /&gt;
a \to b&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим ориентированный граф со следующими множествами вершинам и ребер:&lt;br /&gt;
множество вершин &amp;lt;tex&amp;gt; V = \{a, b, c, \overline a, \overline b, \overline c\}, &amp;lt;/tex&amp;gt;&lt;br /&gt;
множество ребер &amp;lt;tex&amp;gt; E = \{(\overline a, b), (\overline b, a), (\overline a, c), (\overline c, a), (b, c), (\overline c, \overline b), (\overline a, \overline b), (b, a)\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим в графе следующие пути:&lt;br /&gt;
* &amp;lt;tex&amp;gt; \overline a \to b \to a &amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \overline a \to \overline b \to a &amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \overline c \to a &amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; a \to c &amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \overline a \to b \to c &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Т.к. &amp;lt;tex&amp;gt; \overline a \to a &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; a = 1, \overline a = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Т.к. &amp;lt;tex&amp;gt; a \to c &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; a = 1 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; c = 1, \overline c = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; может быть любым, т.к. все вершины, из которых можно добраться в &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; имеют значение ноль.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt; Ответ: &amp;lt;/b&amp;gt; &amp;lt;tex&amp;gt; a = 1, b = 0, c = 1 &amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt; a = 1, b = 1, c = 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Второй пример ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим следующую функцию: &lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
(\overline a \vee c) \wedge&lt;br /&gt;
(\overline c \vee \overline a) \wedge&lt;br /&gt;
(a \vee b) \wedge&lt;br /&gt;
(\overline b \vee a)&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная функция эквивалентна функции &lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
a \to c \wedge&lt;br /&gt;
\overline c \to \overline a \wedge&lt;br /&gt;
c \to \overline a \wedge&lt;br /&gt;
a \to \overline c \wedge&lt;br /&gt;
\overline a \to b \wedge&lt;br /&gt;
\overline b \to a \wedge&lt;br /&gt;
b \to a \wedge&lt;br /&gt;
\overline b \to \overline a&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Построим ориентированный граф со следующими множествами вершинам и ребер:&lt;br /&gt;
множество вершин V = &amp;lt;tex&amp;gt;\{a, b, c, \overline a, \overline b, \overline c\}, &amp;lt;/tex&amp;gt;&lt;br /&gt;
множество ребер &amp;lt;tex&amp;gt; E = \{(a, c), (\overline c, \overline a), (c, \overline a), (a, \overline c), (\overline a, b), (\overline b, a), (b, a), (\overline b, \overline a)\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим следующий путь: &amp;lt;tex&amp;gt; a \to c \to \overline a \to b \to a &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда следует, что &amp;lt;tex&amp;gt; a \to \overline a \to a &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Следовательно по ранее доказанной теореме, у данной функции решений нет.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt; Ответ: &amp;lt;/b&amp;gt; Решений нет.&lt;br /&gt;
&lt;br /&gt;
== Использование 2SAT  ==&lt;br /&gt;
&lt;br /&gt;
Решение &amp;lt;tex&amp;gt;\mathrm {2SAT}&amp;lt;/tex&amp;gt; может потребоваться в следующих задачах: &lt;br /&gt;
*латинские квадраты&amp;lt;ref&amp;gt; [https://ru.wikipedia.org/wiki/Латинский_квадрат Википедия — Латинские квадраты] &amp;lt;/ref&amp;gt;, &lt;br /&gt;
*квазигруппы&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/Квазигруппа_(социология) Википедия — Квазигруппы]&amp;lt;/ref&amp;gt;,&lt;br /&gt;
*числа Рамсея&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/Теорема_Рамсея#.D0.A7.D0.B8.D1.81.D0.BB.D0.B0_.D0.A0.D0.B0.D0.BC.D1.81.D0.B5.D1.8F Википедия — Числа Рамсея]&amp;lt;/ref&amp;gt;,&lt;br /&gt;
*система Штейнера&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/Система_Штейнера Википедия — Система Штейнера]&amp;lt;/ref&amp;gt;,&lt;br /&gt;
*проектирование протоколов (пример: для сетевых коммуникаций),&lt;br /&gt;
*электронная коммерция (Электронные аукционы и автоматизированные брокеры,&lt;br /&gt;
*теории кодирования, криптографии,&lt;br /&gt;
*проектирование и тестирование лекарств (мед. препаратов).&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
*[[3CNFSAT | NP-полнота задачи о выполнимости булевой формулы в форме 3-КНФ]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
*[http://e-maxx.ru/algo/2_sat MAXimal :: algo :: Задача 2SAT (2-CNF) ]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/2-satisfiability Википедия — 2-satisfiability]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Булевы функции ]]&lt;/div&gt;</summary>
		<author><name>Songx</name></author>	</entry>

	</feed>