- •Элементарные алгоритмы для работы с графами
- •Работа алгоритма[править | править вики-текст]
- •Неформальное описание[править | править вики-текст]
- •Формальное описание[править | править вики-текст]
- •Алгоритм поиска в глубину[править | править вики-текст]
- •Нерекурсивные варианты[править | править вики-текст]
- •Общая идея
- •[Править]Пошаговое представление
- •[Править]Реализация
- •[Править]Время работы
- •[Править]Цвета вершин
- •Топологическая сортировка и сильно связные компоненты
- •↑ Пример ориентированного неотсортированного графа, к которому применима топологическая сортировка
- •Пример работы алгоритма[править | править вики-текст]
- •Алгоритмы[править | править вики-текст]
- •Минимальные остовные деревья (мst)
- •Введение
- •Постановка задачи
- •Кратчайшие пути
- •Давайте придумаем что-нибудь простое
- •А если я педант?
- •Задача о максимальном потоке
- •[Править]Определение потока
- •[Править]Пример
- •Увеличивающие пути. Теорема Бержа
- •Алгоритм Эдмондса. Сжатие цветков
- •Эффективная реализация
- •Оптимизация: предварительное построение паросочетания
- •Случай двудольного графа
- •Дальнейшая оптимизация
- •[Править]Реализация
- •[Править]Оценка производительности
- •[Править]Пример несходящегося алгоритма
- •[Править]Оценка быстродействия
- •[Править]Литература
- •Максимальные паросочетания[править | править вики-текст]
- •Описание алгоритма Необходимые определения
- •Теорема Бержа
- •Алгоритм Куна
- •Время работы
- •Реализация
- •Улучшенная реализация
- •[Править]Постановка задачи
- •[Править]Решение
- •[Править]Псевдокод
- •Префиксы и суффиксы строки
- •Прямые переходы
- •[Править]Суффиксные ссылки
- •Основные определения и описание структуры[править | править вики-текст]
- •Свойства суффиксных деревьев[править | править вики-текст]
- •Требования суффиксного дерева к памяти[править | править вики-текст]
- •[Править]Недостатки
- •Метод хеширования
- •[Править]Алгоритм
- •[Править]Псевдокод
- •[Править]Время работы
- •[Править]Надёжность
- •Автоматные модели в программировании
- •[Править]Переходы между состояниями [править]Прямые переходы
- •[Править]Суффиксные ссылки
- •[Править]Псевдокод
- •[Править]Пример использования
- •[Править]Псевдокод
- •[Править]Пример
- •[Править]Время работы
- •[Править]Эффективный алгоритм
- •[Править]Псевдокод
- •[Править]Время работы
- •[Править]Построение префикс-функции по z-функции [править]Постановка задачи
- •[Править]Описание алгоритма
- •Приближенные алгоритмы решения np-трудных задач
[Править]Оценка производительности
Добавляя
поток увеличивающего пути к уже имеющемуся
потоку, максимальный поток будет получен,
когда нельзя будет найти увеличивающий
путь. Тем не менее, если величина
пропускной способности — иррациональное
число, то алгоритм может работать
бесконечно. В целых числах таких проблем
не возникает и время работы ограничено
,
где
—
число рёбер в графе,
—
максимальный поток в графе, так как
каждый увеличивающий путь может быть
найден за
и
увеличивает поток как минимум на 1.
[Править]Пример несходящегося алгоритма
рис. 1
Рассмотрим
приведённую справа сеть, с источником
,
стоком
,
пропускными способностями
рёбер
,
и
соответственно
,
и
и
пропускной способностью всех остальных
рёбер, равной целому числу
.
Константа
выбрана
так, что
.
Мы используем пути из остаточного графа,
приведённые в таблице, причём
,
и
.
Шаг |
Найденный путь |
Добавленный поток |
Остаточные пропускные способности |
||
|
|
|
|||
0 |
|
|
|
|
|
1 |
|
|
|
|
|
2 |
|
|
|
|
|
3 |
|
|
|
|
|
4 |
|
|
|
|
|
5 |
|
|
|
|
|
Заметим,
что после шага 1, как и после шага 5,
остаточные способности рёбер
,
и
имеют
форму
,
и
,
соответственно, для какого-то
натурального
.
Это значит, что мы можем использовать
увеличивающие пути
,
,
и
бесконечно
много раз, и остаточные пропускные
способности этих рёбер всегда будут в
той же форме. Полный поток после шага 5
равен
.
За бесконечное время полный поток
сойдётся к
,
тогда как максимальный поток равен
.
Таким образом, алгоритм не только
работает бесконечно долго, но даже и не
сходится к оптимальному решению.
[править]Пример медленной работы алгоритма Форда-Фалкерсона с использованием поиска в глубину по сравнению с реализацией, использующей поиск в ширину
При использовании поиска в ширину алгоритму потребуется всего лишь 2 шага. Дана сеть (рис. 2).
рис. 2
Благодаря двум итерациям (рис. 3 и рис. 4)
рис. 3
рис. 4
рёбра
насытились
лишь на 1. Конечная сеть будет получена
ещё через 1998 итераций (рис. 5).
рис. 5
Алгоритм Эдмондса-Карпа
Алгоритм
Для
заданной сети
алгоритм
Эдмондса-Карпа находит поток максимальной
величины из заданного истока
в
заданный сток
за
.
[править]Псевдокод
Edmonds_Karp (G, s, t)
for
(для) каждого ребра
do
while
существует кратчайший
путь
из
в
в остаточной сети
do
for
(для) каждого ребра
do
[править]Корректность алгоритма Эдмондса-Карпа
Алгоритм Эдмондса-Карпа является реализацией метода Форда-Фалкерсона. На каждой итерации цикла while поток в графе увеличивается вдоль одного из кратчайших путей в из истока в сток . Этот процесс повторяется до тех пор пока существует кратчайший путь в . Если в не существует кратчайшего пути из в , значит, не существует никакого вообще никакого пути в следовательно по теореме Форда-Фалкерсона найденный поток максимальный.
