Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
всё для проги / Программирование на ЯВУ-Снижко / Динамические структуры данных.doc
Скачиваний:
107
Добавлен:
26.03.2015
Размер:
397.31 Кб
Скачать

Представление графов

Для представления графов можно использовать различные структуры данных. Выбор структуры зависит от операторов, которые будут применяться к вершинам и дугам графа. Одним из наиболее общих представлений графа является матрица смежности. Если граф содержитnвершин, то матрица смежности для него – это матрица А размераnxnсо значениями логического типа, гдеA[i,j] =trueтогда и только тогда, когда существует дуга из вершиныiв вершинуj. Время доступа к матрице смежности зависит от размеров множества вершин и множества дуг. Представление орграфа в виде матрицы смежности удобно применять в тех алгоритмах, в которых надо часто проверять существование данной дуги.

Обобщением описанного представления орграфа с помощью матрицы смежности можно считать представление взвешенного орграфа также посредством матрицы смежности, но у которой элемент A[i,j] равен весу дугиij. Если такой дуги не существует, то значениеA[i,j] не может быть значением какой-либо допустимой метки, а может рассматриваться как «пустая» ячейка. На рис.11 показана матрица смежности для взвешенного орграфа из рис. 10.

О

Рис. 5. Матрица смежности для взвешенного орграфа с рис. 10

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

П

Рис. 6. Структура списков смежности для орграфа из рис. 10

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

На рис.12 показана структура данных, представляющая орграф на рис. 10 посредством связанных списков смежности. Веса дуг можно хранить в ячейках связанных списков.

Наиболее общие операторы, выполняемые над орграфами, включают операторы чтения меток вершин и дуг, вставки и удаления вершин и дуг и оператор перемещения по последовательностям дуг. Последний оператор требует пояснений. Часто в программах встречается операторы, которые неформально можно описать подобно следующему:

for каждая вершина w, смежная с вершиной v

{некоторые действия с вершиной w}

Для реализации такого оператора необходим индексный тип данных для работы с множеством вершин, смежных с заданной вершиной v. Например, если для орграфа используются списки смежности, то индекс – это позиция в списке смежности вершиныv. Если применяется матрица смежности, тогда индекс – целое число, соответствующее смежной вершине. Для просмотра множества смежных вершин необходимы следующие три оператора:

First (v)возвращает индекс первой вершины, смежной с вершинойv. Если вершинаvне имеет смежных вершин, то возвращается «нулевая» вершина.

Next (v, i)возвращает индекс вершины, смежной с вершинойv, следующий за индексомi. Еслиi– индекс последней вершины, смежной с вершинойv, то возвращается.

Vertex (v, i)возвращает вершину с индексомiиз множества вершин, смежных сv. Если для представления орграфа используется матрица смежности, тоVertex(v,i) просто возвращает индексi.

Пример. Функции просмотра множества смежных вершин

int First (int v)

{

int i;

for (i=0; i<n; i++)

if (A[v][i])

return i+1;

return 0;

}

int Next (int v, int i)

{

int j;

for (j=i+1; j<n; j++)

if (A[v][j])

return j;

return 0;

}

Последовательный просмотр вершин, смежных с вершиной v.

int i = First (v);

while (i)

{

w = Vertex (v, i);

/* действия с вершиной w */

i = Next (v, i);

}

Соседние файлы в папке Программирование на ЯВУ-Снижко