например: • Транспортные маршруты между городами • Социальные связи между людьми • Вложенность папок и файлов в файловой системе • Ссылки в веб-документах • … Как это обрабатывать?
— непустое множество вершин • — множество ребер — пар вершин Граф может быть • Неориентированным, в нем ребра — неупорядоченные пары • Ориентированным, где ребра — упорядоченные пары, тогда они зовутся дугами
вершин существует путь • Связный орграф — сильно связный граф (существует ориентированный путь) • Слабо связный орграф — граф, в котором после замены дуг ребрами получается связный неориентированный граф • Компонента связности — максимальный по включению связный граф (так же и для сильной и слабой связности) 2 компоненты связности
котором нет кратных ребер и петель, в противном случае — мультиграф (псевдограф) • Полный граф — простой неориентированный граф, где между каждой вершиной существует ребро • Пустой граф — граф без вершин • Регулярный граф — граф, в котором степени всех вершин равны • Плоский граф — граф, изображенный на плоскости без пересечений ребер в точках, отличных от вершин • Планарный граф — граф, который представим в виде плоского • Взвешенный граф — граф, в котором каждому ребру сопоставлено значение (вес) Полный граф Регулярный граф Взвешенный граф Пустой граф
связный граф без циклов • Если ориентированный — граф, где только одна вершина имеет степень входа 0 (корень дерева), а у остальных вершин степень захода 1 • Вершина является листом, если ее степень — 1
степеней всех вершин графа равна удвоенному числу его ребер • Следствие — любой граф имеет четное число вершин нечетных степеней • Любое дерево с вершинами содержит ребро. Более того, если для связного графа выполняется такое соотношение, то он — дерево • Полный граф с вершинами имеет ребер
где значение равно числу ребер из i-ой вершины в j-ую • Иногда, особенно если граф неориентирован, петля считается за два ребра • В случае взвешенного графа можно на место ставить вес ребра • Определить вес ребра или его наличие можно за • Матрица занимает памяти, поэтому такой способ представления хорошо подходит для плотных графов
вершины. • Неориентированный граф: ◦ на месте стоит 1, если i-ая вершина инцидентна j-ому ребру, ◦ иначе 0 • Орграф: ◦ на месте стоит 1, если i-ая вершина является началом j-ой дуги ◦ если является концом, то –1 ◦ иначе 0 • Матрица занимает памяти
смежности Проверка наличия ребра Определение степени вершины Использовани е памяти Сравнение представлений графов Матрицы смежности и инцидентности целесообразнее использовать когда: • Число вершин графа невелико • Число рёбер графа относительно большое • В алгоритме часто требуется проверять, соединены ли между собой две вершины • Матрицы чаще используются в теоретических исследованиях графов Списки смежности целесообразнее использовать когда: • Число вершин графа велико • Число рёбер графа относительно невелико • Во время действия алгоритма часто требуется модифицировать граф • На практике списки чаще используются в прикладных целях
присваивается значение «не посещенная». Выбирается первая вершина и помечается как «посещенная» 2. Для последней помеченной, как «посещенная», вершины выбирается смежная вершина, являющаяся первой помеченной как «не посещенная», и ей присваивается значение «посещенная». Если таких вершин нет, то берется предыдущая помеченная вершина 3. Повторить шаг 2 до тех пор, пока все вершины не будут помечены как посещенные • Временная сложность —
присваивается значение «не посещенная». Выбирается первая вершина и помечается как «посещенная» (и заносится в очередь) 2. Посещается первая вершина из очереди (если она не помечена как посещенная). Все ее соседние вершины заносятся в очередь. После этого она удаляется из очереди 3. Повторяется шаг 2 до тех пор, пока очередь не пуста • Временная сложность —
котором сумма весов ребер (во взвешенном графе) или их количество (невзвешенный граф) будут минимальны Варианты постановки задачи: • Найти кратчайшие пути до всех вершин, кроме данной • Найти кратчайший путь между данной парой вершин • Найти кратчайшие пути между всеми парами вершин
вершины до всех остальных • Можно реализовать за Алгоритм • Каждой вершине из сопоставим метку — минимальное известное расстояние от этой вершины до • Алгоритм работает пошагово — на каждом шаге он «посещает» одну вершину и пытается уменьшать метки • Работа алгоритма завершается, когда все вершины посещены Инициализация. • Метка самой вершины полагается равной 0, метки остальных вершин — бесконечности • Это отражает то, что расстояния от до других вершин пока неизвестны • Все вершины графа помечаются как непосещённые Шаг алгоритма. • Если все вершины посещены, алгоритм завершается • В противном случае, из ещё не посещённых вершин выбирается вершина , имеющая минимальную метку • Мы рассматриваем всевозможные пути, в которых является предпоследним пунктом. Вершины, в которые ведут рёбра из , назовём соседями этой вершины. Для каждого соседа вершины , кроме отмеченных как посещённые, рассмотрим новую длину пути, равную сумме значений текущей метки и длины ребра, соединяющего с этим соседом • Если полученное значение длины меньше значения метки соседа, заменим значение метки полученным значением длины. Рассмотрев всех соседей, пометим вершину как посещённую и повторим шаг алгоритма
вершины до всех остальных • Учитывает отрицательные веса • Работает за Алгоритм • Инициализируются расстояния от исходной вершины до всех остальных вершин, как бесконечные, а расстояние до начальной вершины принимается равным 0. Создается массив размера со всеми значениями равными бесконечности, за исключением элемента , где — исходная вершина • Вторым шагом вычисляются самые короткие расстояния. Следующие шаги нужно выполнять раз, где — число вершин в данном графе ◦ Произведите следующее действие для каждого ребра : Если , то обновите • На этом шаге сообщается, присутствует ли в графе цикл отрицательного веса. Для каждого ребра необходимо выполнить следующее: ◦ Если , то в графе присутствует цикл отрицательного веса
• Предполагается наличие двух эвристических функции- эвристики, которая оценивает расстояние от рассматриваемой вершины к конечной (обозначается как h(x)) • Так же рассматривается функция g(x), которая оценивает расстояние от начальной до текущей • На каждом шаге выбирается узел с наименьшим значением f(x) = g(x) + h(x), после чего этот узел помечается и раскрывается, добавляя вершины, которые можно просмотреть на следующем шаге. • Алгоритм работает до тех пор, пока не дойдет до целевой вершины
показывает, все пути длины 1. • Если булево перемножить матрицу саму на себя, то получим c информацией о всех путях длины 2. • Далее, если раз перемножить матрицу , то получим информацию о путях длины • В итоге булева сумма даст информацию о всех путях в матрице. • Если перемножать и складывать как обычные матрицы, то получим еще и информацию о количестве путей из одной вершины в другую
представляет собой упорядочивание вершин таким образом, что для любого ребра номер вершины меньше номера вершины Топологическая сортировка для графа может быть не одна, к примеру (см. рисунок): • 7, 5, 11, 3, 8, 2, 9, 10 • 3, 7, 5, 8, 11, 10, 9, 2 Применяется, например, при распараллеливании алгоритмов, когда по описанию алгоритма нужно составить граф зависимостей его операций, и, отсортировав топологически, определить, какие операции могут выполняться параллельно
вершины «белые». • Для каждой вершины делаем шаг алгоритма. Шаг алгоритма: • Если вершина «чёрная», ничего делать не надо. • Если вершина «серая» — найден цикл, топологическая сортировка невозможна. • Если вершина «белая»: ◦ Красим её в «серый» ◦ Применяем шаг алгоритма для всех вершин, в которые можно попасть из текущей ◦ Красим вершину в «чёрный» и помещаем её в начало окончательного списка