Ликбез. Конъюнкция — это «правильный» термин для логического «И» (обозначается или &). Конъюнкция возвращает true
тогда и только тогда, когда обе переменные true
.
Ликбез. Дизъюнкция — это «правильный» термин для логического «ИЛИ» (обозначается или |). Дизъюнкция возвращает false
тогда и только тогда, когда обе переменные false
.
Рассмотрим конъюнкцию дизъюнктов, то есть «И» от «ИЛИ» от каких-то переменных или их отрицаний. Например, такое выражение:
(a | b) & (!c | d) & (!a | !b)
Если буквами: (А ИЛИ B) И (НЕ C ИЛИ D) И (НЕ A ИЛИ НЕ B).
Можно показать, что любую логическую формулу можно представить в таком виде.
Задача satisfiability (SAT) заключается в том, чтобы найти такие значения переменных, при которых выражение становится истинным, или сказать, что такого набора значений нет. Для примера выше такими значениями являются a=1, b=0, c=0, d=1
(убедитесь, что каждая скобка стала true
).
В случае произвольных формул эта задача быстро не решается. Мы же хотим решить её частный случай — когда у нас в каждой скобке ровно две переменные (2-SAT).
#Графы импликаций
Казалось бы — причем тут графы? Заметим, что выражение эквивалентно . Здесь «» означает импликацию («если верно, то тоже верно»). С помощью этой подстановки приведем выражение к другому виду — импликативному.
Затем построим граф импликаций: для каждой переменной в графе будет по две вершины, (обозначим их через и ), а рёбра в этом графе будут соответствовать импликациям.

Графы импликаций полезны тем, что если положить какое-либо выражение как верное, то нужно также положить верными и все выражения, которые следуют из него, то есть достижимые в графе импликаций.
Заметим, что если для какой-то переменной выполняется, что из достижимо , а из достижимо , то задача решения не имеет. Действительно: какое бы значение для переменной мы бы ни выбрали, мы всегда придём к противоречию — что должно быть выбрано и обратное ему значение.
Переформулируем данный критерий в терминах теории графов. Если из одной вершины достижима вторая и наоборот, то эти две вершины находятся в одной компоненте сильной связности. Тогда условие существования решения звучит так: для того, чтобы задача 2-SAT имела решение, необходимо, чтобы для любой переменной вершины и находились в разных компонентах сильной связности графа импликаций.
Оказывается, что это условие является не только необходимым, но и достаточным. Доказательством этого факта служит описанный ниже алгоритм.
#Алгоритм решения 2-SAT
Пусть решение существует, и нам надо его найти. Заметим, что для некоторых переменных может выполняться, что из достижимо или из достижимо (но не одновременно). В таком случае выбор одного из значений переменной будет приводить к противоречию, в то время как выбор другого — не будет. Чтобы выбирать из двух значений то, которое не приводит к возникновению противоречий, можно воспользоваться следующим простым правилом.
Правило. Пусть обозначает номер компоненты сильной связности, которой принадлежит вершина , причём номера упорядочены в порядке топологической сортировки компонент сильной связности: если есть путь из в , то . Тогда, если , то выбираем значение , иначе выбираем .
Докажем, что при таком выборе значений мы не придём к противоречию. Пусть, для определённости, , и поэтому была выбрана вершина (для случая доказательство аналогичное).
- Покажем, что из не достижимо . Так как номер компоненты сильной связности больше номера компоненты , то компонента связности расположена «левее» компоненты связности , и из первой никак не может быть достижима последняя.
- Покажем, что из любой вершины , достижимой из , недостижимо . Докажем от противного: пусть из достижимо , а из достижимо . Так как мы получали граф импликаций преобразованием , и из достижимо , то из будет достижимо . Но, по предположению, из достижимо . Тогда мы получаем, что из достижимо , что противоречит условию.
Получается, для любого отмеченного верным выражения не достижимо его отрицание, а также для любых следующих из него выражений не достижимы их отрицания, а значит противоречий при таком правиле не возникнет.
Итак, мы построили алгоритм, который находит искомые значения переменных в предположении, что для любой переменной вершины и находятся в разных компонентах сильной связности:
- Построим граф импликаций, заменив все выражения вида двумя ребрами и .
- Найдем все компоненты сильной связности в графе импликаций.
- Проверим, что для любого значения его отрицание лежит в другой компоненте сильной связности: . Если это не так, то решения не существует.
- Если требуется выводить ответ, то положим условие верным, если , и неверным в противном случае.