Поиск в глубину и применения (12 декабря 2017)
- [20 минут] Компоненты сильной связности
- Алгоритм поиска за O(V+E) двумя dfs (topsort + красим по обратным рёбрам)
- Доказательство корректности
- Применение: конденсация матрица достижимости за O(VE)
- [20 минут] Эйлеровость
- Критерий эйлеровости для ор и неор
- Доказательство и элементарный алгоритм поиска пути:
выделим цикл жадным циклом for (идём вглубь до упора), по индукции сделаем из каждой компоненты оставшихся рёбер Эйлеровы цикл, склеим.
- Алгоритм поиска для орграфа за O(V+E) одним dfs (
result.push_back(e);
на выходе из dfs)
- Картинку с примером
- Алгоритм поиска для неорграфа отличается тем, что после прохода по ребру нужно удалить парное пройденному.
Удаляем лениво: Edge.rev->deleted = true;
− Перерыв −
- [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
- Определение. Переформулировка через импликации, сведение в обе стороны.
- Решаем в форме импликаций, граф из 2n вершин. Видим критерий неразрешимости в компонентах сильной связности.
- Решение за O(V+E): рассматриваем компоненты снизу вверх.
- Корректность: x=e ⇒ не появится противоречий