Связный ациклический граф, имеющий не менее двух вершин, называется деревом. Ориентированным деревом называется орграф без циклов, в котором имеется вершина x0, из которой существует только один ориентированный путь в любую другую вершину. Деревом графа G называется любой его связный ациклический подграф. называется остовным деревом (остовом) Т графа G. При этом ребра остовного дерева T называются ветвями, а ребра графа G, не принадлежащие остову T - хордами. На рис 6. а представлен граф G, на рис. 6. б - одно из его деревьев, на рис. 6 в, г - два остова T1 и T2 графа G, на рис. 6. д - остовное 2 - дерево (лес) графа G.
а б в г д
Рис. 6
Очевидно, что в любом графе существует остов, причем в общем случае остов может быть выделен не единственным способом.
Для построения произвольного остова связного графа могут быть использованы две стратегии: поиск в глубину и поиск в ширину.
Опишем алгоритм поиска в глубину (этот метод стал одной из основных методик проектирования графовых алгоритмов). Поиск начинается с некоторой фиксированной вершины xo, например, с висячей. Затем выбирается вершина x1, смежная с xo. После этого выбирается вершина x2, смежная с x1, и т.д. Ещё не просмотренные вершины будем условно называть новыми. Если на k-м шаге поиска для вершины xk существует новая вершина xk+1, то она выбирается (перестаёт быть новой) и поиск продолжается от вершины xk+1. Если же для вершины xk новых вершин не существует, осуществляется возврат к вершине, из которой мы попали в xk, и поиск осуществляется от неё. Процесс продолжается до тех пор, пока не будет произведён возврат в вершину xo. В процессе поиска вершины соединяют рёбрами.
Поиск в ширину отличается от поиска в глубину тем, что выбор очередной вершины происходит путём просмотра не одной, а всех смежных вершин из списка новых.
Рассмотренные алгоритмы могут быть использованы для построения всех остовных деревьев графа.
При конструкторском и топологическом проектировании РЭА и ЭВА, создании вычислительных сетей важное значение имеет задача определения кратчайшего остова (остова минимального веса) взвешенного графа. Кратчайшим остовом взвешенного графа G будем называть остов, у которого сумма весов всех ребер наименьшая.
Для построения кратчайшего остова графа используются алгоритмы Краскала и Прима.
Алгоритм
Краскала
заключается в следующем. На начальном
этапе из всех ребер графа G выбирается
ребро
минимального веса и включается в остов.
На каждом последующем i-м шаге из еще не
включенных в остов ребер выбирается
ребро, имеющее минимальный вес и не
составляющее циклов с уже выбранными
ребрами. Процесс продолжается до тех
пор, пока в остов не будет включено n-1
ребро.
Алгоритм
Прима
отличается от алгоритма Краскала только
тем, что на каждом этапе строится не
просто ациклический граф, а дерево,
которое в дальнейшем последовательно
разрастается. При этом, если дерево
уже построено, то новое ребро выбирается
не из всех оставшихся ребер графа G, а
только из тех, которые соединяют вершины
дерева
с вершинами, не включенными в
.
Из этих ребер выбирается ребро минимального
веса. При этом необходимо следить за
тем, чтобы не появлялись циклы.
Задача 1. Построить остовное дерево графа с использованием стратегий поиска в глубину и ширину.
Рис. 7
Решение.
1. Поиск в глубину.
Начинаем поиск с любой вершины, допустим, с x1. Выбираем вершину, смежную с x1, например x2. Вершины x1 и x2 соединяем ребром. Далее выбираем вершину x3, смежную с x2. Вершины x2 и x3 соединяем ребром. Продолжая двигаться дальше, соединяем вершины x3 и x4. У вершины x4 три смежных вершины - x5,x7 и x8. Для продолжения поиска можно выбрать любую из них, например x5 . Соединяем ребром вершины x5 и x6, а затем x6 и x7. Попав в вершину x7, видим, что смежной с ней является вершина x4. Но продолжать поиск в данном направлении нельзя, так как вершина x4 уже была просмотрена. Согласно алгоритму возвращаемся в предыдущую вершину, то есть в x6. Так как у x6 нет новых вершин, то возвращаемся в вершину x5. Аналогично из x5 переходим в вершину x4. Вершина x8 является новой, поэтому, согласно алгоритму, выбираем вершину x8 и соединяем вершины x4 и x8 ребром, затем соединяем x8 и x9. У x9 нет новых вершин, кроме x1, но соединить эти вершины мы не можем, так как граф тогда не будет остовом. Мы просмотрели все вершины графа G. Возвращаемся в вершину x1. Найденный остов графа G представлен на рис. 8, а.
2. Поиск в ширину.
Начинаем поиск с любой вершины, например с x1. Соединяем ребрами вершину x1 со всеми смежными ей вершинами - x2, x4 и x9. Теперь по порядку рассматриваем эти смежные вершины. Берем вершину x2. Соединяем её со всеми смежными ей вершинами, то есть с x3. Следующая по порядку вершина x4. Соединяем её со смежными вершинами, то есть с x5, x7 и x8. Затем по порядку идет вершина x9, но соединить её со смежной вершиной x8 мы не можем, так как полученный граф не будет являться остовом. Далее рассматриваем вершины x5, x7 и x8. У x5 есть смежная вершина x6. Соединяем их ребром. У вершин x7 и x8 нет таких смежных вершин. Таким образом, мы получили один из остовов графа G (рис. 8, б).
а б
Рис. 8
Задача 2. С использованием алгоритмов Краскала и Прима построить кратчайший остов для графа
Рис. 9
В таблицах приводится последовательность выбора ребер остовного дерева с использованием алгоритмов Краскала и Прима.
Алгоритм Краскала
Шаг |
Ребро |
Вес |
1 |
x6,x7 |
3 |
2 |
x1,x2 |
5 |
3 |
x3,x4 |
7 |
4 |
x1,x3 |
8 |
5 |
x3,x6 |
9 |
6 |
х11,x13 |
10 |
7 |
x6,x9 |
11 |
8 |
x6,x10 |
12 |
9 |
x3,x11 |
13 |
10 |
x8,x9 |
14 |
11 |
x12,x13 |
15 |
12 |
x4,x5 |
18 |
Шаг |
Ребро |
Вес |
1 |
x6,x7 |
3 |
2 |
x6,x3 |
5 |
3 |
x3,x4 |
7 |
4 |
x1,x3 |
8 |
5 |
x1,x2 |
9 |
6 |
x6,x9 |
10 |
7 |
x6,x10 |
11 |
8 |
x3,x11 |
12 |
9 |
x11,x13 |
13 |
10 |
x8,x9 |
14 |
11 |
x12,x13 |
15 |
12 |
x4,x5 |
18 |
Суммарный вес построенного остова равен 125.
1. Для заданных графов построить остовные деревья с использованием стратегий поиска в глубину и в ширину
а б
Рис. 10
2. Построить кратчайшее остовное дерево с использованием алгоритмов Краскала и Прима для следующих графов: