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