Автор работы: Пользователь скрыл имя, 30 Марта 2013 в 15:43, доклад
Минимальным остовным деревом (МОД) связного взвешенного графа называется его связный подграф, состоящий из всех вершин исходного дерева и некоторых его ребер, причем сумма весов ребер максимально возможная. Если исходный граф несвязен, то описываемую, ниже процедуру можно применять поочередно к каждой его компоненте связности, получая тем самым минимальные остовные деревья для этих компонент.
Введение.
Нахождение кратчайших путей в графе.
Описание алгоритма Краскала.
Псевдокод алгоритма.
Блок-схема алгоритма.
Оценка сложности алгоритма и пример.
Вывод.
Список использованной литературы.
Содержание:
1. Введение.
Граф - Пара объектов G = (X , Г), где Х - конечное множество,
а Г – конечное подмножество прямого произведения Х*Х. При этом Х называется множеством вершин, а Г - множеством дуг графа G .
Подграфом G(V1, E1) графа G(V, E) называется граф с множеством вершин V1 ÍV и множеством ребер (дуг) E1Í E, - такими, что каждое ребро (дуга) из E1 инцидентно (инцидентна) только вершинам из V1. Иначе говоря, подграф содержит некоторые вершины исходного графа и некоторые рёбра (только те, оба конца которых входят в подграф).
Если в множестве Г все пары упорядочены, то такой граф называют ориентированным. Подграф называется остовным подграфом, если множество его вершин совпадает с множеством вершин самого графа.
Минимальным остовным деревом (МОД) связного взвешенного графа называется его связный подграф, состоящий из всех вершин исходного дерева и некоторых его ребер, причем сумма весов ребер максимально возможная. Если исходный граф несвязен, то описываемую, ниже процедуру можно применять поочередно к каждой его компоненте связности, получая тем самым минимальные остовные деревья для этих компонент.
Алгоритм Краскала (или алгоритм Крускала) - алгоритм построения минимального остовного дерева взвешенного связного неориентированного графа. Алгоритм впервые описан Джозефом Крускалом в 1956 году.
Алгоритм Краскала может строить дерево одновременно для нескольких компонент связности, которые в процессе решения объединяются в одно связанное дерево.
Полный граф задается списком ребер. Перед работой список ребер сортируется по возрастанию длины. На каждом шаге просматривается список ребер, начиная с ребра, следующего за вошедшим в решение на предыдущем шаге, и к строящемуся поддереву присоединяют то ребро, которое не образует цикла с ребрами, уже включенными в решение.
Задача о нахождении минимального остовного дерева часто встречается в подобной постановке: есть n городов, через которые можно проложить маршрут так, чтобы можно было добраться из любого города в любой другой (напрямую или через другие города). Требуется найти такой маршрут, чтобы стоимость проезда была максимальной. На практике алгоритм Краскалы применятся в работе авиалиний при нахождении наименьшего воздушного пути из одного пункта назначения в другой.
2. Нахождение кратчайших путей в графе.
Начальные понятия
Будем рассматривать ориентированные графы G = <V, E>, дугам которых приписаны веса. Это означает, что каждой дуге <u, v> ÎE поставлено в соответствие некоторое вещественное число a (u, v), называемое весом данной дуги.
Полагаем, кроме того, a (u, v) = ╔ , если u -a v.
Нас будет интересовать нахождение кратчайшего пути между фиксированными вершинами s, t ÎV. Длину такого кратчайшего пути мы будем обозначать d (s, t) и называть расстоянием от s до t (расстояние, определенное таким образом, может быть отрицательным). Если не существует ни одного пути из s в t, то полагаем d (s, t) = ╔ . Если каждый контур нашего графа имеет положительную длину, то кратчайший путь будет всегда элементарным путем, т.е. в последовательности v1,..., vp не будет повторов.
С другой стороны, если в
графе существует контур отрицательной
длины, то расстояние между некоторыми
парами вершин становится неопределенным,
потому что, обходя этот контур достаточное
число раз, мы можем показать путь
между этими вершинами с
Алгоритм нахождения кратчайшего пути
Данные: Расстояния D[v] от фиксированной вершины s до всех остальных вершин v Î V, фиксированная вершина t, матрица весов ребер, A[u, v], u, v ÎV.
Результаты: СТЕК содержит последовательность вершин, определяющую кратчайший путь из s в t.
Пусть <V, E> -ориентированный граф, | V| = n, | E| = m. Если выбор вершины u происходит в результате просмотра всех вершин, то сложность нашего алгоритма - O(n2). Если мы просматриваем только список ПРЕДШ[v], содержащий все вершины u, такие что u (r) v, то в этом случае сложность будет O(m).
Отметим, что в случае
положительных весов ребер
Далее будем всегда предполагать, что G = < V, E> является ориентированным графом, |V| = n, |E| = m. В целях упрощения изложения и избежания вырожденных случаев при оценке сложности алгоритмов будем исключать ситуации, при которых «большинство» вершин изолированные.
Будем также предполагать, что веса дуг запоминаются в массиве A[u, v], u, vÎ V (A[u, v] содержит вес a (u, v)).
3. Описание алгоритма Краскала.
Вначале текущее множество рёбер устанавливается пустым. Затем, пока это возможно, проводится следующая операция: из всех рёбер, добавление которых к уже имеющемуся множеству не вызовет появление в нём цикла, выбирается ребро минимального веса и добавляется к уже имеющемуся множеству. Когда таких рёбер больше нет, алгоритм завершён. Подграф данного графа, содержащий все его вершины и найденное множество рёбер, является его остовным деревом минимального веса.
Алгоритм состоит из следующей последовательности действий:
4. Псевдокод алгоритма.
Отсортировать ребра в порядке возрастания весов инициализировать структуру разбиений
edgeCount=l
while edgeCount <= E and includedCount <= М-l do
parentl = FindRoot (edge [edgeCount]. start)
parent2 = FindRoot (edge [edgeCount]. end)
if parentl != parent2 then
добавить edge [edgeCount] в остовное дерево
includedCount = includedCount = l
Union (parent1,parent2)
end if
edgeCount=edgeCount+l
end while.
E - число ребер в графе;
V - число вершин в графе
edgeCount - переменная;
includedCount - переменная;
Parent - массив, в котором под каждый элемент множества, с которым мы собираемся работать, отведена одна ячейка;
FindRoot (x) - (x элемент, для которого мы хотим найти корень части, его содержащей) процедура, начинающая с ячейки Parent [x], в которой хранится номер непосредственного предка элемента x;
Union - функция, выполняющая объединение двух частей в одну.
Рис. 1. Общая схема.
Рис. 2. Блок-схема алгоритма сортировки вставками.
Рисунок 3 - Блок-схема алгоритма Краскала
Сложность этого алгоритма совпадает со сложностью используемого алгоритма сортировки, поскольку число операций в цикле while линейно по числу ребер. Поэтому сложность алгоритма Крускала поиска МОД равна O(Elog Е).
Изображение |
Описание |
|
Ребра AD и CE имеют минимальный вес, равный 5. Произвольно выбирается ребро AD (выделено на рисунке). |
|
Теперь наименьший вес, равный 5, имеет ребро CE. Так добавление CE не образует цикла, то выбираем его в качестве второго ребра. |
|
Аналогично выбираем ребро DF, вес которого равен 6. |
|
Следующие ребра — AB и BE с весом 7. Произвольно выбирается ребро AB, выделенное на рисунке. Ребро BD выделено красным, так уже существует путь (зеленый) между B и D, поэтому, если бы это ребро было выбрано, то образовался бы цикл ABD. |
|
Аналогичным образом выбирается ребро BE, вес которого равен 7. На этом этапе красным выделено гораздо больше ребер: BC, потому что оно создаст цикл BCE, DE, потому что оно создаст цикл DEBA, и FE, потому что оно сформирует цикл FEBAD. |
|
Алгоритм завершается добавлением ребра EG с весом 9.Минимальное остовное дерево построено. |
7. Вывод.
Сравним алгоритм Крускала с алгоритмом Прима(в данном докладе рассмотрен не был). Сравнивать будем по количеству затраченного времени поиска дерева, по суммарному весу дерева, по количеству сравнений и присвоений для каждого из алгоритмов. Время вычисляется как среднее время выполнения алгоритмов.
Для алгоритма Прима количество сравнений и присваиваний больше, так как нужно сортировать данные два раза (в алгоритме Крускала 1 раз). Можно сделать вывод, что для нахождения остова для графов с большим количеством вершин, алгоритм Прима будет затрачивать больше времени. Также для разреженных графов более применим алгоритм Крускала.
8. Список использованной литературы.
1. Свободная энциклопедия ВикипедиЯ [Электронный ресурс]. - Режим доступа: http://ru. wikipedia.org/.
2. Макконелл Дж. Основы современных алгоритмов: 2-е дополненное издание М.: Техносфера, 2004. - 368с. ISBN 5-94836-005-9.
3. [Электронный ресурс] http://www.lotos-khv. narod.ru/.
4. Новиков Ф.А. Дискретная математика для программистов. 2008. с. 327-330