Автор работы: Пользователь скрыл имя, 27 Ноября 2013 в 21:51, реферат
Часто бывает полезно и наглядно изображать некоторую ситуацию в виде рисунка, состоящего из точек (вершин), представляющих основные элементы ситуации, и линий (ребер), соединяющих определенные пары этих вершин и представляющих связи между ними. Такие рисунки известны под общим названием – графы.
Введение . . . . . . . . . . . . . . . . . . . . 3
Алгоритмы на графах . . . . . . . . . . . . . . . . 3
Методы систематического обхода вершин графа . . . . . 4
Алгоритм поиска в глубину
Алгоритм поиска в ширину
Остовное дерево наименьшего веса. Задача Штейнера . . 7
Алгоритм Прима
Алгоритм Краскала
Задача плоской укладки . . . . . . . . . . . . . . 10
Гамма-алгоритм
Задача раскраски графа . . . . . . . . . . . . . . 13
Метод неявного перебора
Приближенный алгоритм
Нахождение кратчайших путей . . . . . . . . . . . . 15
Алгоритм Дейкстры
Алгоритм Флойда
Эйлеровы графы . . . . . . . . . . . . . . . . . 18
Задача о наибольшем потоке . . . . . . . . . . . . 19
Алгоритм Форда-Фалкерсона
Заключение . . . . . . . . . . . . . . . . . . . 20
Алгоритм Прима
Пусть часть остовного дерева уже построена. Это утверждения всегда верно, так как в начале процесса вершина с которой начинается построение уже входит в дерево. Итак, если часть основного дерева уже есть, то множество вершин графа можно разделить на два подмножества: подмножество состоящее из вершин уже построенного остовного дерева и оставшихся вершин графа.
Очевидно, что среди ребер соединяющихся эти два множества существует ребро наименьшего веса. Доказывается, что минимальное дерево проходит через это ребро.
Приведем наиболее общую cхему алгоритма:
Алгоритм Краскала
Искомые ребра
соединяют вершины. Поэтому возможны
две стратегии построения. Можно
идти от вершин и для каждой из них
искать минимальное ребро (как это
сделано в алгоритме Прима) а
можно для каждого ребра
Другими словами, алгоритм организует процесс роста компонент связности в процессе которого он объединяются друг с другом до тех пор пока не останется одна являющаяся конечным результатом (компонента связности - это такой связный подграф нашего графа, что добавление любой вершины ведет к потере связности).
Схема алгоритма:
Практическое применение алгоритмов решения задачи
Задача плоской укладки
Среди большого множества задач на графах можно встретить следующую: как изобразить некий граф на плоскости так, чтобы никакие два его ребра не пересекались, т.е. нарисовать исходный граф как граф без самопересечений. Такую задачу принято называть задачей о плоской укладке графа.
Плоский граф — это граф, нарисованный таким образом, что его ребра не пересекаются. Говорят, что граф допускает плоскую укладку, если его можно нарисовать как плоский. Также плоские графы называют планарными.
Пример плоского графа
Для плоской укладки графа и попутной проверки, планарен ли он, удобно пользоваться гамма-алгоритмом.
Гамма-алгоритм
На вход подаются графы, обладающие следующими свойствами:
Если нарушено свойство (1),
то граф нужно укладывать отдельно
по компонентам связности. Если нарушено
свойство (2), то граф — дерево и нарисовать
его плоскую укладку
Инициализация алгоритма производится так: выбираем любой простой цикл и получаем две грани: Γ1 — внешнюю и Γ2 — внутреннюю.
Обозначим выбранный цикл как G′. На каждом шаге будем строить множество сегментов. Каждый сегмент S относительно уже построенного графа G′ представляет собой одно из двух:
Те вершины, которые одновременно принадлежат G′ и какому-то сегменту, назовем контактными.
Если все контактные вершины сегмента S имеют номера вершин какой-то грани Γ, то мы будем говорить, что грань Γ вмещает этот сегмент и обозначать S⊂Γ. Может быть имеется не одна такая грань, вмещающая сегмент S, множество таких граней обозначим Γ(S), а их число |Γ(S)|.
Общий шаг алгоритма следующий: обозреваются все сегменты и определяются числа |Γ()|. Если хоть одно из них равно 0, то граф не планарен. Иначе, выбираем сегмент, для которого число |Γ(S)| минимально, или один из множества, если таких сегментов несколько. В этом сегменте найдем цепь между двумя контактными вершинами и уложим ее в любую из граней множества Γ(S), совместив контактные вершины сегмента с соответствующими вершинами грани. При этом данная грань разобьется на две. Уже уложенная часть графа G′ по количеству ребер и вершин увеличится, а сегмент, из которого вынута цепь, исчезнет или развалится на меньшие с новыми контактными вершинами, ведущими к вершинам G′.
В результате повторения общего шага либо будет получена плоская укладка, когда множество сегментов станет пустым, либо будет получено, что граф G не является планарным.
Схема алгоритма:
Практическое применение алгоритма решения задачи
Область применения алгоритма для решения этой задачи весьма обширна. Хорошим примером может послужить проблема изготовления электронных микросхем. Электрические цепи печатным способом наносятся на плату из изолирующего материала. Так как наносимые цепи не изолированы, то они не должны пересекаться. Отсюда вытекает вопрос, как расположить контакты на схеме, чтобы можно было без пересечений нанести цепи на плату. А если так сделать нельзя, то каким минимальным числом плат (слоев графа) можно обойтись.
Задача раскраски графа
При решении практических задач с применением графов возникает необходимость в разбиении множества вершин графа на классы попарно несмежных между вершин. Довольно часто дополнительно требуется, чтобы таких классов было наименьшее число. В теории графов подобные задачи формулируются в терминах раскраски вершин графа.
(Графы, рассматриваемые
далее, являются
Задача нахождения числа цветов, которыми могут быть раскрашены вершины графа так, что не найдется двух смежных вершин одного цвета, называется задачей о раскраске (задачей раскраски) графа.
Граф, раскрашенный таким образом называется r-хроматическим, а число цветов, необходимых для такой раскраски графа, называется хроматическим числом графа G и обозначается .
Для определения хроматического числа графа может быть использован достаточно эффективно простой метод неявного перебора.
Метод неявного перебора
Схема алгоритма:
Предположим, что множество вершин как-то упорядочено и
— i-я вершина этого множества. Тогда первоначальная допустимая раскраска может быть получена так:
Данный алгоритм можно ускорить, используя следующие замечания:
Приближенный алгоритм
В этом простейшем
из методов вершины вначале
Описание алгоритма:
Первая вершина окрашивается в цвет 1. Затем список вершин просматривается сверху вниз (по невозрастанию степеней) и в цвет 1 окрашивается всякая вершина, которая не смежна с другой, уже окрашенной в этот цвет. Потом возвращаемся к первой в списке неокрашенной вершине, окрашиваем ее в цвет 2 и снова просматриваем список вершин сверху вниз, окрашивая в цвет 2 любую неокрашенную вершину, которая не соединена ребром с другой, уже окрашенной в цвет 2 вершиной. Аналогично действуем с цветами 3, 4 и т. д., пока не будут окрашены все вершины. Число использованных цветов будет тогда приближенным значением хроматического числа графа.
Приведенный
выше алгоритм можно модифицировать.
Для этого после каждого шага
нужно упорядочивать
В данной модификации предполагалось, что если две вершины имеют одинаковые степени, то порядок таких вершин случаен. Такие вершины можно также упорядочить, но уже по двухшаговым степеням. Двухшаговую степень определим как сумму относительных степеней инцидентных вершин. Аналогично можно поступать и далее.
Также можно изначально упорядочивать вершины по двухшаговым или трехшаговым степеням.
Применение алгоритмов решения задачи о раскраске графа на практике:
В задачах теории расписаний осмотры представляются в виде временных интервалов. Каждому осмотру можно сопоставить вершину некоторого графа, причем две любые вершины графа будут соединены ребром лишь тогда, когда соответствующие им осмотры нельзя осуществлять одновременно. Требуется составить такой график осмотра, который связан с наименьшими временными затратами (с учетом приведенных выше ограничений на «совместимость» осмотров). Эта задача эквивалентна задаче о раскраске вершин графа с использованием наименьшего числа цветов. Хроматическое число графа как раз и соответствует осмотру, требующему наименьших временных затрат.
Пусть для выполнения каких-то n работ надо распределить m имеющихся в наличии ресурсов. Считаем, что каждая из работ выполняется за некоторый (одинаковый для всех работ) промежуток времени и что для выполнения i-й работы требуется подмножество ресурсов Si.