Тема 10. Деревья.
Дерево, лес, их характеристические свойства.
Опр. Граф называется деревом, если он связный и в нем нет циклов.
Одноэлементный граф, т.е. граф, имеющий одну вершину и не имеющий ребер, также считается деревом.
Граф называется лесом (или ациклическим графом), если в нем нет циклов. Очевидно, что каждая компонента связности леса - дерево.
Деревья обладают рядом характеристических свойств, по наличию или отсутствию каждого их которых в рассматриваемом графе 𝐺 = (𝑉, 𝐸) можно определить, является граф деревом или нет. Перечислим эти свойства:
1) граф 𝐺 - дерево в том и только в том случае, когда в нем нет циклов и |𝐸| = |𝑉| − 1;
2) граф 𝐺 - дерево в том и только в том случае, когда он связный и |𝐸| = |𝑉| − 1;
3) граф 𝐺 - дерево в том и только в том случае, когда он связный, и каждое его ребро является мостом;
4) граф 𝐺 - дерево в том и только в том случае, когда любые две вершины графа 𝐺 можно соединить простой цепью, притом единственной;
5) граф 𝐺 - дерево в том и только в том случае, когда в нем нет циклов и добавление к нему нового ребра приводит к образованию единственного простого цикла.
Одно из характеристических свойств леса: граф 𝐺 = (𝑉, 𝐸), имеющий 𝑘 компонент связности, является лесом в том и только в том случае, когда |𝐸| = |𝑉| − 𝑘.
Остовы графа.
Подграф , графа 𝐺 называется остовным подграфом, если множество его вершин совпадает с множеством вершин графа 𝐺.
Остовом обыкновенного графа называется его остовный подграф, являющийся деревом.
Число остовов в графе с занумерованными вершинами.
Пусть 𝐺 = (𝑉, 𝐸) - связный граф. Если 𝐺 содержит хотя бы один цикл, то удалив из графа 𝐺 некоторое ребро этого цикла, мы уменьшим число циклов графа по крайней мере на единицу, сохранив при этом его связность. Ясно, что, последовательно разрушая циклы данного графа, можно прийти к остову графа. Поскольку дерево с |𝑉| вершинами имеет ровно |𝑉| − 1 ребро, то для получения остова нужно удалить из графа |𝐸| − (|𝑉| − 1) ребро, т.е. число ребер, равное цикломатическому числу 𝜈(𝐺) связного графа 𝐺.
Пусть теперь 𝐺 = (𝑉, 𝐸) - произвольный граф с 𝑘 компонентами связности. Из каждой компоненты связности 𝐺i = (𝑉i , 𝐸i) этого графа удалим |𝐸i| − |𝑉i| + 1 ребро так, чтобы получился остов этой компоненты. В результате получим некоторый остовный лес графа 𝐺. Подсчитаем общее число ребер, которое нам пришлось для этого удалить. Сложив равенства |𝐸i| − |𝑉i| + 1, 1 ≤ 𝑖 ≤ 𝑘, получим:
∑ ki=1(|𝐸i| − |𝑉i| + 1) = ∑ki=1 |𝐸i| − ∑ki=1 |𝑉i| + 𝑘 = |𝐸| − |𝑉| + 𝑘 = 𝜈(𝐺).
Таким образом, чтобы получить остовный лес, нужно, последовательно разрушая циклы графа, удалить из него число ребер, равное его цикломатическому числу.
Пусть 𝐺 - обыкновенный связный граф. Упорядочим множество его вершин 𝑉 = {𝑣1, 𝑣2,..., 𝑣n}. Определим матрицу Кирхгофа 𝐾(𝐺) графа 𝐺, положив:
где 𝐴(𝐺) - матрица смежности графа, соответствующая данному упорядочению вершин.
Справедливы следующие утверждения:
1) алгебраические дополнения всех элементов матрицы Кирхгофа графа равны между собой;
2) число остовов в связном неодноэлементном обыкновенном графе равно алгебраическому дополнению любого элемента его матрицы Кирхгофа.
Алгоритм Краскала отыскания минимального остова.
Взвешенным графом называется граф, на множестве ребер которого задано отображение 𝜌: 𝐸 → [0; +∞), приписывающее каждому ребру 𝑒 неотрицательное число 𝜌(𝑒).
Число 𝜌(𝑒) называется весом ребра 𝑒, число 𝜌(𝐺) = ∑e∈E𝜌(𝑒) - весом графа 𝐺.
Остов
𝑇
связного взвешенного графа 𝑮
называют минимальным
остовом,
если для любого остова
выполнено
неравенство 𝜌(𝑇)
≤ 𝜌(
)
Алгоритм: Пусть 𝐺 - связный взвешенный граф.
0-й шаг. Строим остовный подграф 𝑇0 графа 𝐺, множество 𝐸0 ребер которого пусто.
𝑘 -й шаг. Пусть 𝑇k-1 - остовный подграф с множеством ребер 𝐸k-1 = {𝑒1, 𝑒2, . . , 𝑒k-1}, построенный к началу этого шага. Из множества ребер 𝐸\𝐸k-1 выбираем ребро 𝑒k так, чтобы выполнялись два условия:
а) добавление ребра 𝑒k не приводит к образованию циклов;
б) из ребер, удовлетворяющих условию а), ребро 𝑒k обладает наименьшим весом.
После чего повторяем 𝑘 -й шаг.
Кодирование деревьев.
Выделим в дереве какую-нибудь одну вершину, которую назовем корнем. Полученное дерево с выделенной вершиной называется корневым.
Опр.
Бинарным
кодом
корневого дерева с одним ребром является
последовательность (01). Пусть деревья
𝑇1
и 𝑇2
с корнями a и b соответственно (рис. 3.40)
имеют коды
и
.
Тогда кодом дерева 𝑇3
с корнем с является код (0
1),
а кодом дерева 𝑇4
с корнем 𝑐
= 𝑎
= 𝑏
- код (
).
Чтобы построить корневое дерево по коду из нулей и единиц, нужно разбить последовательность на пары 0 и 1, следуя правилу: первая попавшаяся в коде единица образует пару с предшествующим нулем; каждая следующая единица образует пару с ближайшим слева неиспользованным нулем. Если образованные таким образом пары пометить снизу кода фигурными скобками, то каждая такая скобка будет соответствовать ребру графа.
Для задания деревьев c занумерованными вершинами используют код из натуральных чисел (код Прюфера).
Код Прюфера для дерева с занумерованными вершинами строят следующим образом. Находят висячую вершину с наименьшим номером. Записывают номер смежной с ней вершины (это начало кода), после чего удаляют эту висячую вершину вместе с инцидентным ей ребром. Для полученного в результате данной операции дерева находят висячую вершину с наименьшим номером, записывают номер смежной с ней вершины (это продолжение кода), после чего удаляют эту висячую вершину вместе с инцидентным ей ребром. Так поступают до тех пор, пока не останется последнее ребро (его вершины в код не включают). Полученная в результате описанных действий последовательность и есть код Прюфера. Заметим, что длина этого кода на единицу меньше числа ребер и на две единицы меньше числа вершин дерева.
Построение
дерева по коду из натуральных чисел
рассмотрим на примере кода [2 2 4 4 6 6].
Прежде всего заметим, что дерево, которое
нам предстоит построить, имеет 8 вершин.
Будем преобразовывать последовательность
224466, действуя по следующей схеме. Вместо
первого числа запишем наименьшее
натуральное число, которое в этой
последовательности не встречается,
т.е. 1; получим последовательность 124466.
Вместо второго числа в новой
последовательности запишем наименьшее,
не встречающееся в ней, т.е. 3; получим
последовательность 134466, и т.д. Действуем
так до тех пор, пока все числа в исходной
последовательности не будут заменены.
Расположим все последовательности друг
под другом; под последней из них запишем
код дерева (см. рис. 3.47). Выпишем пары
вершин, записанные друг под другом в
последних двух строчках: (12), (32), (24), (54),
(46), (76). Каждая такая пара - это пара концов
одного из ребер дерева. Этот список
дополним парой вершин, отсутствующих
в предпоследней строчке, т.е. парой
(6,8). Теперь построим дерево: отметим на
плоскости точки - вершины дерева и
соединим их ребрами согласно списку.
