Поиск в глубину: двусвязность, 2-sat (22 января 2021)
- Разбираем код и dfs-ы
- Проверка внутри или снаружи
- Цикл for
- Инкапсуляция через struct
- Константы
- [6 минут] Раскраски
- В 2 цвета = dfs
- В 3 цвета = трудно (умеют только за экспоненту). В минимальное число цветов, тем более.
- Но как всё-таки действовать? жадный алгоритм за O(V+E) через удаление вершины минимальной степени
- [30 минут] Двусвязность
- Определения: рёберная, вершинная, мосты, точки сочленения
- Наивный алгоритм поиска всех мостов и точек сочленения за O(VE)
- Поиск компонент по данным мостам, точкам сочленения. Упор на то, что компоненты вершинной двусвязности − множества рёбер.
- Идея алгоритма поиска мостов: если пройдём вниз по мосту, вверх подняться без этого моста не сможем
- Алгоритм поиск мостов через 1 dfs.
- Учим этот dfs искать компоненты (доставать их из стека).
- Таким же образом ищем точки сочленения
- Таким же образом ищем компоненты вершинной двусвязности (стек рёбер, что делать с парным ребром)
- Корректность всех алгоритмов (на самом деле алгоритм един, его конечная версия ищет всё и сразу)
- Условия: (mt[x] ≥ t[v]) ⇔ is_bridge (new_component), (mt[x] ≥ t[v]) ⇔ is_point (new_component)
- [15 минут] 2-SAT
- Определение. Отличие SAT и 2-SAT.
- Примеры: подписи к отрезкам.
- Орграф импликаций на 2n вершинах.
- Противоречия. Жадное решение: попробуем x1 = true, если пришли к противоречию, значит x1 = false. O(VE).
- Видим в графе импликаций компоненты сильной связности. Решение за O(V+E): рассматриваем компоненты снизу вверх.
- Корректность: x=e ⇒ не появится противоречий
− Перерыв −
- Если успеем − алгоритм Полларда