Similar presentations:
Лекция 7. Алгоритм А. Минимальные остовы. Потоки в сетях
1.
Алгоритм А*Функция “предсказания” f(v)=g(v)+h(v)
Используем эвристики:
● Манхэттенское расстояние
● Расстояние Чебышева
● Евклидово
2.
Ограничение на эвристикиДопустимость h(v) -- для любой вершины эвристика не превосходит
реальное кратчайшее расстояние
Монотонность h(v) -- для любых двух вершин на пути разница эвристик не
превышает реального расстояния между ними
Монотонность -> допустимость
Монотонность -> На любом пути f(v) не убывает
3.
Остовные деревья4.
Остовное деревоАциклический связный подграф, включающий все вершины графа.
Как найти?
5.
Минимальное остовное деревоОстовное дерево, обладающее минимальным суммарным весом рёбер
6.
Лемма о безопасном ребреПусть G’ -- подграф миностова G
Ребро не из G’ -- безопасное, если при добавлении его в G’ он не прекратит
быть подграфом миностова
Разрез -- разделение множества вершин на S и T, <S,T>
Ребро пересекает разрез <S,T>, если один его конец принадлежит S, а
второй -- T
7.
Лемма о безопасном ребреРассмотрим граф G -- взвешенный неориентированный. G’ -- подграф его
миноста, <S,T> -- разрез G такой, что его не пересекает ни одно ребро G’.
Тогда ребро минимального веса, пересекающее разрез -- безопасное.
8.
Алгоритм ПримаПохож на Дейкстру
Пытаемся построить миностов, начиная с любой вершины. Когда есть
несколько вершин -- получаем, по факту, разрез. Ищем минимальное ребро
в этом разрезе, включая новую вершину.
Включив новую вершину -- релаксируем пути до невключённых, если нужно
9.
Асимптотика алгоритма Прима10.
Алгоритм КрускалаОтсортируем все рёбра в порядке возрастания и будем последовательно
добавлять в остов.
Если ребро соединяет вершины из разных компонент связности текущего
остова -- берём, иначе -- не берём
11.
Система непересекающихся множествКаждое множество -- дерево, корень -- его “представитель”. В каждой
вершине -- ссылка на родителя
Объединение -- подвесим корень одного к корню другого. Понять, в каком
множестве вершина -- пройтись до родителя
12.
Эвристики СНМОбъединение по рангу.
Подвешиваем дерево с меньшей высотой к дереву с большей. Чтобы не
считать высоты -- используем ранги. Ранг одной вершины -- 0. При
объединении -- максимум из двух. Если одинаковые -- +1
Сжатие пути
Храним указатель не на родителя, а на корень. Для этого при получении
родителя обновляем все указатели, чтобы указывали на корень
Асимптотика -- обратная функция Аккермана (сложно, считать константной)
13.
Асимптотика алгоритма КрускалаСортировка рёбер -- O(ElogE)
СНМ -- O(E*alpha(V))
Общая асимптотика -- O(ElogE)
14.
Алгоритм Борувки1. Каждая вершина графа -- дерево
2. Для каждого дерева найдём минимальноe инцидентное ему ребро.
Добавим в миностов все рёбра
3. Повторяем шаг 2, пока не получим одно дерево
(В пункте 2 лучше брать ребро минимального номера при равных весах)
15.
Алгоритм Борувки. Асимптотика1. На каждом шаге количество деревьев сокращается как минимум вдвое.
То есть шагов -- logV
2. Каждый раз надо просмотреть все рёбра, ведущие от дерева.
Итоговая асимптотика -- O(ElogV)
16.
Максимальный поток в сети.RMQ & LCA
17.
Определение сети и потокаСеть -- орграф, с:E->R+, с(e) -- пропускная способность. В сети есть исток s и
сток t
Поток в Сети -- f:(VxV)->R, где:
1)f(u,v) = -f(v,u)
2)f(u,v) <= c(u,v)
3) Сумма f(x,y) = 0 для всех вершин, кроме s и t
Величина потока -- сумма f(s,v) для всех v
18.
Разрез. Поток через разрезРазрез <S,T> -- знаем
Пропускная способность разреза -- сумма всех рёбер, пересекающих разрез
Минимальный разрез -- разрез с минимально возможной пропускной
способностью
Поток в разрезе -- сумма по f(u,v), (u,v) пересекает разрез
19.
Лемма о величине потокаf(S,T) = |f|
20.
Лемма о минимальном разрезеЕсли f(S,T) = c(S,T), то поток f максимален, а разрез -- минимален
21.
Ещё определения22.
Теорема Форда-ФалкерсонаЕсли f -- поток в сети G = (V,E), то следующие утверждения эквивалентны:
1. Поток f максимален
2. В Gf не существует пути из s в t
3. |f| = c(S,T) для некоторого разреза сети
23.
Алгоритм Форда-ФалкерсонаПоложим f(u,v) = 0
Далее поток увеличивается итеративно через поиск увеличивающего пути
Поиск можно осуществлять с помощью dfs
Повторяем, пока можем найти увеличивающий путь
O(|E|f)
24.
Алгоритм Эдмонса-КарпаУлучшение алгоритма Форда-Фалкерсона, в качестве дополняющего пути
берём кратчайший по рёбрам
Асимптотика O(VE^2)
Найти новый кратчайший по рёбрам путь можем только VE раз
Во-первых, длина пути -- от 1 до V
Сколько различных путей длины i? Ну где-то Е
25.
Алгоритм ДиницаСлоистая сеть
Определим для каждой вершины v длину кратчайшего s->v.
В слоистую сеть включаем только те рёбра (u,v), что d[u] + 1 = d[v]
Слоистая сеть -- вспомогательная
Найдём блокирующий поток -- такой, что любой путь из s в t содержит
насыщенное этим потоком ребро. Увеличить не получается.
26.
Поиск блокирующего потока1) Можно просто искать все пути s->t по одному и наполнять(по крайней
мере одно ребро удалится
2) Оптимизация -- удалять заполненные рёбра и все лишние (из которых
нельзя дойти до стока) O(VE)
27.
Алгоритм Диница1) Инициализируем f(u,v) = 0
2) Построим вспомогательную сеть для остаточной данного графа. Если
пустая -- останавливаемся
3) Найдём блокирующий поток f’ в Gl
4) Дополним поток f найденным потоком f’ и повторим с 2
Поиск блок.потока в слоистой сети -- О(VE). Почему итераций -- не более
|V|? После пропускания блок.потока по слоистой сети кратчайший
дополняющий путь будет длиннее хотя бы на 1. max(length) = |V|
Асимптотика -- O(V^2E)
28.
ПаросочетанияПаросочетание -- набор попарно несмежных рёбер в двудольном графе.
Максимальное паросочетание -- паросочетание с наибольшим количеством
рёбер
Чередующаяся цепь -- рёбра поочерёдно принадлежат/не принадлежат
паросочетанию
Увеличивающая цепь -- чередующаяся цель, у которой начальная и
конечная вершины не принадлежат паросочетанию
29.
Теорема БержаПаросочетание максимально тогда и только тогда, когда не существует
увеличивающих относительно него цепей.
Пусть существует увеличивающая цепь. Тогда “сдвинем” рёбра на один (раз
первое и последнее не принадлежат -> увеличим паросочетание -> оно не
максимально
30.
Теорема Бержа <=1. Пусть парсоч M не содержит ув. пути, но есть парсоч M’, который больше
чем M
2. Рассмотрим граф G -- симметрич. отрицание M и M’ -- все рёбра,
которые лежат либо в М, либо в M’, но не одновременно. Рассмотрим
как граф
3. У каждого ребра из G есть смежное (если нет, то просто добавим его в M
или M’, получим противоречение)
4. Циклы -- чётные + чередуются из M и M’. Значит, в циклах равное
количество
5. Пути -- чётные. Почему? Если неч, значит начинается с M’ и
заканчивается M’, то есть для M это увеличивающий путь.
6. Если всё чётное -- их размер одинаковые и условие не выполнено
31.
Алгоритм Куна поиска паросочетанийВозьмём пустое паросочетание, пока в графе находим увеличивающую цепь
-- выполняем “чередование” и повторяем процесс.
Ищем любую цепь, запуская обход в глубину или ширину вдоль каждой
вершины из первой доли. Найдя -- “насыщаем”, то есть вычёркиваем из
оставшихся, а обратную считаем созданной. Повторяем, пока не кончатся
увеличивающие цепи
32.
Алгоритм Куна1. Возьмём пустое паросочетание
2. Пока удаётся найти увеличивающую цепь -- выполняем чередование
Массив matching[v] -- вторая вершина из парсоча или -1
Массив used -- посещена вершина или нет
Функция -- просматриваем все вершины, смежные с v. Если to ненасыщенная или
удаётся найти ненасыщенную через рекурсивный запуск от to -- нашли
увеличивающую цепь и чередуем.
Функция применяется последовательно ко всем вершинам, перед каждым
запуском обнуляем used
O(VE)