Вы находитесь на странице: 1из 5

Алгоритмы на графах

Граф состоит из конечного множества вершин (узлов) и набора рёбер,


соединяющих эти вершины. Две вершины считаются смежными, если они
соединены друг с другом одним и тем же ребром.
Ниже приведён ряд базовых понятий, относящихся к графам. Они
проиллюстрированы примерами на рисунке 1.
 Порядок: число вершин в графе.
 Размер: число рёбер в графе.
 Степень вершины: число рёбер, инцидентных вершине.
 Изолированная вершина: вершина, которая не связана ни с одной
другой вершиной графа.
 Петля: ребро, вершины которого совпадают.
 Ориентированный граф: граф, в котором все рёбра имеют
направление, определяющее начальную и конечную вершину.
 Неориентированный граф: граф с рёбрами, которые не имеют
направления.
 Взвешенный граф: рёбра такого графа имеют определённый вес.
 Невзвешенный граф: рёбра такого графа не имеют никаких весов.

Рис. 1. Терминология графов (схематичное изображение)


1. Поиск в ширину
Рис. 2. Визуальное отображение обхода на графах (поиск в ширину)
Обход или поиск — это одна из фундаментальных операций, выполняемых
на графах. Поиск в ширину начинается с определённой вершины, затем
исследуются все её соседи на данной глубине и происходит переход к
вершинам следующего уровня. В графах, в отличие от деревьев, могут быть
циклы — пути, в которых первая и последняя вершины совпадают. Поэтому
необходимо отслеживать посещённые алгоритмом вершины. При реализации
алгоритма поиска в ширину используется структура данных «очередь».
На рисунке 2 показан пример того, как выглядит поиск в ширину на графе.
Жёлтым цветом помечаются обнаруженные вершины, красным —
посещённые.
Применяется для:
 определения кратчайших путей и минимальных остовных деревьев;
 индексации веб-страниц поисковыми ботами;
 поиска в соцсетях;
 нахождения доступных соседних узлов в одноуровневых сетях, таких
как BitTorrent.
2. Поиск в глубину
Рис. 3. Визуальное отображение обхода на графах (поиск в глубину)
Поиск в глубину начинается с определённой вершины, затем уходит как
можно дальше вдоль каждой ветви и возвращается обратно. Здесь тоже
необходимо отслеживать посещённые алгоритмом вершины. Для того, чтобы
стало возможным возвращение обратно, при реализации алгоритма поиска в
глубину используется структура данных «стек».
На рисунке 3 показан пример того, как выглядит поиск в глубину на том же
графе, который использован на рисунке 2. Граф обходится на всю глубину
каждой ветви с возвращением обратно.
Применяется:
 для нахождения пути между двумя вершинами;
 для обнаружения циклов на графе;
 в топологической сортировке;
 в головоломках с единственным решением (например, лабиринтах).
3. Кратчайший путь
Рис. 4. Визуальное отображение кратчайшего пути от вершины 1 к вершине 6
Кратчайший путь от одной вершины графа к другой — это путь, при
котором сумма весов рёбер, его составляющих, должна быть минимальна.
На рисунке 4 показан кратчайший путь на графе от вершины 1 до вершины 6.
Алгоритмы нахождения кратчайшего пути:
1. Алгоритм Дейкстры(для неотрицательных весов на ребрах)
2. Алгоритм Беллмана-Форда(любой вес на ребре).
Применяются в:
 картографических сервисах типа Google maps или Apple maps для
прокладки маршрутов и определения местоположения;
 сетях для решения проблемы минимальной задержки пути;
 абстрактных автоматах для определения через переход между
различными состояниями возможных вариантов достижения
некоторого целевого состояния, например минимально возможного
количества ходов, необходимого для победы в игре.
4. Обнаружение циклов
Рис. 5. Цикл
Цикл — это путь, в котором первая и последняя вершины графа совпадают.
То есть путь, начинающийся и завершающийся в одной и той же вершине,
называется циклом. Обнаружение циклов — это процесс выявления таких
циклов. На рисунке 5 показано, как происходит обнаружение цикла.
Алгоритмы обнаружения цикла:
1. Алгоритм Флойда.
2. Алгоритм Брента.
Применяются:
 в распределённых алгоритмах, использующих сообщения;
 для обработки крупных графов с использованием распределённой
системы обработки в кластере;
 для обнаружения взаимоблокировок в системах с параллельным
выполнением;
 в криптографических приложениях для выявления ключей сообщения,
которые могут соответствовать одному и тому же зашифрованному
значению.

Вам также может понравиться