
- •Тема 2.
- •2.1. Из теории графов.
- •1.2. Понятие графа и его составляющие.
- •2.3 Связные графы.
- •2.4. Поиск путей в графе.
- •2.5. Задача Эйлера.
- •2 .6. Плоские графы и формула Эйлера.
- •2.7. Задачи о раскрасках графа.
- •Тема 3.
- •3.1. Представление графов матрицами.
- •3.2. Код Харари.
- •3.3. Деревья и ордеревья.
- •3.4. Бинарные деревья и их представление в памяти.
- •3.5. Код Прюфера.
- •3.6. Обход деревьев.
- •3.7. Деревья и списки.
- •3.8. Поиск в дереве.
Тема 3.
Графы как структурные обработки данных.
Здесь изучают различные способы представления графов в памяти компьютера. Они применяются во многих алгоритмах в задачах поиска информации. Существует несколько подходов к представлению данных в графе в памяти компьютера: матрицы, списки, коды.
3.1. Представление графов матрицами.
Напомним, что матрица – прямоугольная таблица чисел.
А=
Aij – элемент i-строки, j-столбца.
Матрица размером m x n.
Если m=n – матрица называется квадратной.
В программе матрицы называют двумерными массивами.
Матрица смежности.
Опр.
Пусть дан орграф с n
пронумерованными вершинами. Матрица А
размера m
x
n,
заполненная числам
,
назывется матрицой смежности орграфа.
Она определяет орграф однозначно (по матрице можно восстановить граф)
Недостаток матрицы смежности – большое количество нулей (она разрешена).
Если у графа 10 вершин 20 дуг, то из 100 элементов матрицы 80 нулей.
Для неориентированного графа матрица смежности строится точно так же, но он обладает дополнительными хорошим свойствам.
aij=aji. Это свойство означает симметричность матрицы относительно главной диагонали.
В этом случае нет смысла хранить в память всю матрицу, достаточно ее верхний треугольник АI
Матрица смежности и число путей.
Заметим, что сама матрица смежности число путей длины 1 из i-й вершины в j-ю
j
i
Нельзя узнать число путей большей длины.
Вспомним операцию умножения матриц (умножение строк на столбцы). Если умножить квадратную матрицу саму на себя, получим квадрат матрицы А2=А*А: А3=А2*А и т. д.
Теорема Степень матрицы смежности Аm заполнена элементам aijm, показывает число путей длины m из i-й вершины в j-ю.
Доказательство
В частности случая m=2
А2=А*А заполнена произведениям строк на столбец aij=ai1*a1j+ai2*a2j+ain*anj= 0*0+0*1+1*1
Из этой суммы останется только члены 1*1, то есть aik=1 и akj=1.
П
олучим
путь длины 2 из i-й
вершины в j-ю,
а вся сумма показывает нам число таких
путей.
Аналогично доказывается для n=3,4 и т.д.
Матрица инцидентности.
Опр. Пусть в орграфе m вершин и n дуг (все пронумерованы).
Матрица B размером m x n заполняется числам
bij=
Можно заметить, что в каждом столбце матрицы инцидентности встречается 1 и -1, остальные – нули (ил же 2 и остальные нули).
Поэтому и эти матрица тоже очень разряжена (при больших m)
Поэтому возникла мысль кроме матриц использовать отдельные числа (коды) для компактного представления графов.
3.2. Код Харари.
Идея Фрэнка Харари (США) – установить матрицу смежности в 1 число.
Пусть дан неориентированный граф. Мы уже знаем, что его матрица смежности А симметрична относительно главной диагонали м достаточно хранить её верхний треугольник АI. Распишем его в виде двоичной строки (слева направо, сверху вниз).
-> 0 1I
0I
0 1I
1
Меняем нумерацию вершин графа, точно так же получим другие двоичные строки (числа). Сравним между собой именно как число (по первому биту). Наибольшее из полученных чисел и есть код Харари, а нумерация вершин, давшая это число, называется канонической.
Код Харари определяет граф однозначно. При общении между людьми код Харари принято переводить в десятичное число.
П
ример:
Найти код Харари графа
А=
AI=
-> 0 1 1I 1 0I0
А=
AI=
->
1 1 0I
0 1I
0
Вершину с петлей ставим первой, а соседнюю с ней – второй.
Очевидно, увеличить полученное число нельзя, значит, мы получили каноническую нумерацию вершин и код Харари. Переведём в десятичную систему. Получится 50.
Видимо, существует алгоритм, сразу нумерующий вершины графа каноническим образом (учитывая петли и число соседней (степен вершин)).
Заметим, что не всякое десятичное число служит кодом Харари какого-либо графа. Дело в том, что проделав все эти действия в обратном порядке, мы получим граф с нумерацией вершин, который вовсе не обязан быть канонической.