Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебно-практическое пособие ПРОГ.doc
Скачиваний:
37
Добавлен:
20.11.2019
Размер:
5.63 Mб
Скачать

6.10.Некоторые сд для хранения графов и деревьев

Любой граф может быть представлен в матричной форме.

Матрицей смежности графа G=(V,E) называется матрица A порядка nn, где n=|V|. Элемент матрицы смежности аij=1, если (vi,vj)Е, vi,vjV и aij=0, если (vi,vj)Е.

Для графа, изображенного на рис. 6.10, матрица смежности представлена в таблице 6.2.

Отметим, что для неориентированных графов матрица смежности симметрична относительно главной диагонали, то есть в памяти ЭВМ достаточно хранить только половину матрицы.

Таблица 6.2

Матрица смежности графа, изображенного на рис.6.10

0

1

0

0

0

0

1

1

0

0

0

1

1

0

0

0

Матрицей инцидентности графа G=(V,E) называется матрица B порядка nm, где n=|V|, m=|E|. Элементы матрицы инцидентности bij определяются следующим образом: bij=1, если i-я вершина является началом j-ой дуги, bij=-1, если i-я вершина является концом j-ой дуги, bij=0, если i-я вершина и j-я дуга не инцидентны.

Для неориентированных графов в матрице инцидентности элементам достаточно присваивать только два символа (1 и 0).

Для графа, представленного на рис. 6.10, матрица инцидентности показана в таблице 6.3.

Таблица 6.3.

Матрица инцидентности графа, изображенного на рис.6.10

1

0

0

0

-1

-1

1

1

0

0

0

-1

0

1

0

0

0

-1

-1

1

Заметим, что с помощью матрицы инцидентности не могут быть закодированы петли графа. В свою очередь в матрице смежности теряется информация о кратных рёбрах (параллельных дугах). Поэтому в некоторых случаях требуется отходить от определений и вводить дополнительные структуры данных.

При кодировании взвешенного графа вместо единичных элементов матрицы смежности удобно записать веса соответствующих дуг, а веса несуществующих дуг полагать равными бесконечности (обозначение )2. Такая матрица называется матрицей весов.

Матрица весов для графа, представленного на рис.6.11, приведена в таблице 6.4.

Таблица 6.4

Матрица весов графа, изображенного на рис.6.11

10

12

30

10

10

10

20

10

15

8

10

8

10

10

9

5

На практике очень часто матрицы, представляющие графы, бывают сильно разряженными, то есть содержат много символов «0» или «». Это приводит к неоправданным затратам памяти при хранении этих матриц в ЭВМ.

Объем памяти можно существенно уменьшить, если упаковывать матрицы в массивы смежности. Пример упаковки рассмотренной матрицы весов (табл. 6.4) в массивы приведен на рис. 6.12.

Для нахождения вершин, смежных i–ой вершине, и весов соответствующих дуг по массивам смежности необходимо вычислить начальный In и конечный Ik индексы в массивах V и S по формулам: In=Ui ; Ik=Ui+1-1.

Тогда SIn,SIn+1,…,SIk - вершины, смежные i-ой вершине, VIn,VIn+1,…,VIk – длины дуг (i,SIn),(i,SIn+1,),…,(i,SIk).

Для хранения упакованной таким образом матрицы весов понадобится 43 ячейки памяти, занимаемых массивами V,S и U. Неупакованная матрица занимала 1010=100 ячеек памяти.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

V

10

12

30

10

10

10

20

10

15

8

10

8

10

10

9

5

S

2

3

5

4

6

4

6

7

9

7

8

7

8

10

10

10

U

1

4

6

8

10

12

14

15

16

17

17

Рис.6.12. Упаковка матрицы весов (табл. 6.4) в массивы смежности

Еще один способ хранения графов - это массив рёбер, то есть массив записей, в котором перечислены все рёбра графа (каждая запись кодирует ребро). Массив рёбер графа, представленного на рис. 6.11, приведен на рис. 6.13. Здесь массив занимает 48 ячеек.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

I

1

1

1

2

2

3

3

4

4

5

5

6

6

7

8

9

J

2

3

5

4

6

4

6

7

9

7

8

7

8

10

10

10

V

10

12

30

10

10

10

20

10

15

8

10

8

10

10

9

5

I - начальная вершина, J – конечная вершина,

V – вес дуги (I,J)

Рис.6.13. Массив рёбер графа, изображенного на рис.6.11

При реализации алгоритмов, в которых изменяется исходный граф, например, добавляются или удаляются вершины, для хранения графов иногда удобно применять списки смежности. Списки смежности представляют собой линейный список из n элементов, где n – число вершин графа (главный список). В качестве элементов главного линейного списка выступают подчиненные линейные списки. В i-ом подчиненном списке число элементов равно числу вершин смежных i-ой вершине графа. Каждый такой элемент хранит номер вершины (j) смежной i-ой вершине графа. Если граф взвешенный, то также хранится вес соответствующей дуги (i,j).

Для графа, изображенного на рис. 6.11, список смежности представлен на рис. 6.14.

Еще один способ хранения графов - это список рёбер, то есть список, в котором перечислены все рёбра графа. Список рёбер графа, представленного на рис. 6.11, приведен на рис. 6.15.

Естественно, что рассмотренные способы хранения взвешенных графов пригодны и для хранения не взвешенных графов. При хранении не взвешенных графов ячейки, предназначенные для хранения веса ребра, становятся не нужными.

Выбор того или иного способа кодирования графа и структуры данных для его реализации зависит как от конкретной задачи, алгоритма её решения, возможных входных данных и других факторов.

Теперь рассмотрим один из способов хранения ориентированных деревьев. Поскольку дерево является частным случаем графа, то для его хранения подойдет любая из рассмотренных структур хранения графов.

Например, дерево, изображенное на рис.6.16 может быть сохранено матрицей смежности, представленной в табл.6.5.

Таблица 6.5