Лекция 7 Деревья
Определение дерева Дерево – связный граф без циклов.
Задача: построить 6 неизоморфных деревьев порядка 6 1 Д 1 1 2 3 4 5 6 6 1 2 2 3 Д 2 4 5 6 1 2 L(1, 6)=4 L(1, 5)=4 4 3 3 4 5 2 2 Д 4 4 1 6 5 1 2 6 3 4 Д 6 1 5 3 5 Д 3 L(1, 5)=4 Д 5 6 Deg(1)=5
Лес – несвязный граф без циклов; он состоит из нескольких деревьев. Пример: Лес из двух деревьев порядка 4
Основная теорема о деревьях : Для (n, m) графа следующие утверждения равносильны: 1. G – дерево (связный граф без циклов) 2. G – связный граф и m=n-1 3. G – ациклический и m=n-1 4. G – граф, у которого любые две вершины соединены единственной цепью. 5. G – ациклический со свойством: если две несмежные вершины соединить ребром e, то G+е будет иметь цикл и только один. 1 5 2 4 3
Докажем, что из (1) следует (2): Доказательство проведем индукцией по числу вершин n: n=1 m = 0 = 1 1; m=n 1 n=2 m =2 1 = 1 Пусть любое дерево порядка < n имеет m 1= n 1 1 ребер. Докажем, что дерево порядка n имеет m = n 1 ребер. Рассмотрим G e, где e ребро G. По свойству 3 связных графов G e имеет 2 компоненты, в которых количество вершин пусть равно n 1 и n 2, где n 1< n, n 2 < n, n 1+n 2 = n. По индукции для этих компонент выполняется условие 2, т. е. m 1 = n 1 1, m 2= n 2 1 (m 1, m 2 количество ребер в компонентах). Всего ребер в графе G: m 1+m 2+1= n 1 1 + n 2 1+1 = n 1= m Теперь по индукции из (1) следует (2).
Докажем, что из (2) следует (3). Дано: G - связный граф, m=n-1. Доказать: G- ациклический, m=n-1. Нужно доказать только, что G без циклов. От противного: Пусть в G есть цикл С, е Є С. По свойству 3 связных графов, G e связный граф, и m = n-2. С другой стороны, по свойству 4: n k ≤ m, k =1 (граф связный), поэтому n-1 ≤ m. n 1 ≤ n 2, 0 ≤ 1 Получаем противоречие.
Следствие: у любого дерева не менее двух висячих вершин. ∑deg Vi = 2 m = 2 n 2 (m = n 1). Если степени всех вершин дерева ≥ 2, тогда ∑deg Vi ≥ 2 n , но такого не может быть (2 n > 2 n 2). Если только одна висячая, тогда ∑deg Vi ≥ 2(n 1)+1 2 n 1>2 n 2 и этого не может быть.
Циклический ранг связного графа Пусть G произвольный связный (n, m) граф. m ≥ n 1 (равенство будет, если G дерево) Число V= m n +1 называется циклический рангом связного графа. V означает, что для получения остова связного графа надо удалить у графа m n +1 ребер. 1 5 4 3 Пример. G (5, 7) граф, V = m n+1=7 5 +1=3. Нужно удалить 3 ребра, чтобы получить его остов. Удалим ребра 5 4 3 е 1= (1, 5), е 2 = (2, 3), е 3 = (3, 4).
Задача о волейбольной сетке Какое наибольшее количество разрезов можно сделать в волейбольной сетке (5 10 клеток) так, чтобы она не распалась?
Циклический ранг произвольного графа Теорема: число ребер графа G, которое надо удалить для получения остова, равно V = n m + k, где n, m, k число вершин, ребер и компонент графа G. Доказательство: если (ni , mi) граф Hi является одной из компонент графа G, то для превращения ее в остовное дерево нужно удалить ni mi +1 подходящих ребер. Суммируя эти равенства по всем k компонентам получим требуемое равенство число V = n m + k. Число V = n m + k называется циклическим рангом графа G.
Теорема Кэли (другая формулировка): Число помеченных деревьев Dn = Пусть вершины дерева имеют метки 1, 2, 3, …, n. Такие деревья называются помеченными. • При n = 1 и n = 2 формула очевидна. • При n = 3 имеем 3 помеченных дерева • При n>3 для доказательства теоремы используем коды Прюфера.
Коды Прюфера Закодируем каждое помеченное дерево порядка n словом, содержащим n-2 символов в алфавите 1, 2, … …, n. Полученное слово называется кодом Прюфера. Строится код так: выбираем в дереве вершину степени 1 с наименьшей меткой. Сотрем ее вместе с ее ребром и запишем номер, стоящий на другом конце этого ребра. Этот номер будет первым символом кода Прюфера. Повторяем эту процедуру над оставшимся деревом до тех пор, пока не получится дерево с двумя вершинами. Полученный код является кодом Прюфера помеченного дерева.
Коды Прюфера Каждому помеченному дереву порядка n соответствует единственный код Прюфера длины n – 2. код Прюфера 2444 Наоборот, по коду Прюфера однозначно строится соответствующее помеченное дерево.
Построение дерева по коду Прюфера Правило построения помеченного дерева по коду Прюфера (2444) : записываем код и под ним в порядке возрастания те метки, которые не вошли в кодовое слово. Слово, записанное снизу, назовем антикодом ( в примере 1356). код: 2444 антикод: 1356 Вершину, помеченную первой меткой в коде, соединим с вершиной, соответствующей первой метке антикода, после чего вычеркиваем эти метки из кода и антикода. Если вычеркнутая метка кода не встречается в оставшейся части кодового слова, то впишем ее в антикод на соответствующее место. Первое ребро (2, 1). Новый код: 444 антикод: 2356. Следующее ребро (4, 2).
Построение дерева по коду Прюфера Повторяем эту процедуру до тех пор, пока все метки в коде не будут вычеркнуты. Наконец, соединим две вершины, помеченные метками оставшейся части антикода. Получаем дерево D 6 c 5 ребрами: (2, 1), (4, 2), (4, 3), (4, 5) и (4, 6).
Корневые деревья Определение. Дерево называется «корневым» , если одна из его вершин выделена (корень дерева). Следствие (из теоремы Кэли). Число корневых деревьев с n помеченными вершинами равно nn-1.
Задача Андрей пошел с отцом в тир с условием: он делает пять выстрелов и за каждое попадание получает право еще на два выстрела. Андрей выстрелил 25 раз. Сколько раз он попал в мишень? Стрельбу Андрея можно описать корневым деревом, в котором все вершины, кроме корня (начальное состояние игры у Андрея 5 патронов), соответствуют выстрелам.
Решение задачи о стрельбе Если Андрей попал, то степень соответствующей вершины равна трем, если промазал единице. Степень корня равна пяти. Дерево стрельбы Андрея имеет 26 вершин и 25 ребер. Пусть n число попаданий Андрея. Тогда дерево содержит n вершин степени 3, (25 n) вершин степени единица и одну вершину степени 5. Используя лемму о рукопожатиях, получаем равенство: 3 n + 1 (25 n) + 5 1 =2 25 или 2 n = 20, n =10. Ответ: Андрей попал в мишень 10 раз.
Двоичные деревья Определение: Корневое дерево называется двоичным, если корень имеет степень 2, а все остальные вершины имеют степень 1 или 3. Двоичные деревья появляются, например, при вычислении значения выражений (A*B)*(C*D) (рис. слева), A*(B*(C*D)) (рис. справа):
Код двоичного дерева Каждое двоичное дерево можно однозначно закодировать двоичным словом, совершая обход всех вершин графа поиском в глубину, начиная с корня. При этом договоримся писать 0, если ребро проходим первый раз, и 1, если возвращаемся по нему в предыдущую вершину. Дерево на рисунке ниже имеет двоичный код 001011.
Кодовые слова висячих вершин двоичного дерева Каждую висячую вершину двоичного дерева можно тоже закодировать двоичным словом, двигаясь от корня по единственной цепи к этой вершине, записывая 0 при движении влево, и 1 при движении вправо. Для висячих вершин двоичного дерева на рисунке ниже получим кодовые слова: для А 1, для B 01, для C 000, для D 001.
Взвешенный граф Пусть G граф, w: E → R вещественная функция, cтавящая в соответствие каждому ребру e E число w(e), называемое весом ребра e. Пару (G, w) называют взвешенным (нагруженным) графом. Весом любого взвешенного графа называется сумма всех весов его ребер. Пример: вес графа прямоугольного треугольника с катетами длиной 3 и 4 равен 12.
Задача о проектировании сети минимальной стоимости Проектируется сеть шоссейных дорог, связывающих 5 населённых пунктов. Известна стоимость строительства любой дороги, соединяющих два пункта. Нужно построить самую дешёвую сеть, по которой можно проехать из любого пункта в любой другой.
Полный перебор вариантов не эффективен Искомая сеть будет остовом минимального веса графа проектируемых дорог. Полный помеченный граф Кn по теореме Кэли содержит nn 2 различных остовных деревьев (для данного графа число остовов 53 = 125), поэтому решение этой задачи полным перебором вариантов потребовало бы больших вычислений даже при малых n. Для её решения разработаны эффективные методы алгоритмы Д. Краскала (1956 г. ) и Р. Прима (1957 г. ), применимые к произвольному связному графу.
Алгоритм Краскала заключается в следующем: 1. Строится подграф Т 1=Оn + e 1, где Оn пустой остовный подграф в G, e 1 – ребро минимального веса. 2. Если построен подграф Тi, содержащий i рёбер, и i < n 1, то строится ациклический подграф Тi+1= Тi + ei+1, где ei+1 рёбро графа G, имеющее минимальный вес среди ребер, не входящих в Тi и не образующий циклов с рёбрами из Тi. Теорема. 1) При i < n 1 граф Тi+1 можно построить. 2) Граф Тn 1 является остовом минимального веса во взвешенном графе
Пример решения задачи
Алгоритм Прима отличается от алгоритма Краскала тем, что на каждом шаге строится не просто подграф без циклов, а дерево: 1. Выбираем ребро e 1 = (a, b) минимального веса и строим дерево D 1 = e 1. 2. Если дерево Di, содержащее i ребер уже построено, и i < n 1, то среди ребер, соединяющих вершины этого дерева с вершинами графа G, не входящими в Di, выбираем ребро ei+1 минимального веса и строим дерево Di+1 = Di ei+1.
Пример алгоритма Прима
Оценка эффективности алгоритма Краскала Теорема. Алгоритм Краскала строит минимальный остов (n, m) графа G за время O(m n). Доказательство: в алгоритме Краскала n 1 шагов; на каждом шаге разыскивается ребро минимального веса из некоторого списка ребер, содержащего не более m ребер, поэтому число операций кратно m n.


