- •Очередь
- •Двусвязные списки
- •Пример использования стеков: постфиксная, префиксная и инфиксная записи
- •Бинарныедеревья
- •Общие деревья
- •Реализация деревьев
- •Представление графов
- •Задача нахождения кратчайшего пути
- •Нахождение кратчайших путей между парами вершин
- •Транзитивное замыкание
- •Нахождение центра ориентированного графа
- •Обход ориентированных графов
Представление графов
Для представления графов можно использовать различные структуры данных. Выбор структуры зависит от операторов, которые будут применяться к вершинам и дугам графа. Одним из наиболее общих представлений графа является матрица смежности. Если граф содержитnвершин, то матрица смежности для него – это матрица А размераnxnсо значениями логического типа, гдеA[i,j] =trueтогда и только тогда, когда существует дуга из вершиныiв вершинуj. Время доступа к матрице смежности зависит от размеров множества вершин и множества дуг. Представление орграфа в виде матрицы смежности удобно применять в тех алгоритмах, в которых надо часто проверять существование данной дуги.
Обобщением описанного представления орграфа с помощью матрицы смежности можно считать представление взвешенного орграфа также посредством матрицы смежности, но у которой элемент A[i,j] равен весу дугиij. Если такой дуги не существует, то значениеA[i,j] не может быть значением какой-либо допустимой метки, а может рассматриваться как «пустая» ячейка. На рис.11 показана матрица смежности для взвешенного орграфа из рис. 10.
О
Рис. 5. Матрица
смежности для взвешенного орграфа с
рис. 10
П
Рис. 6. Структура
списков смежности для орграфа из рис.
10
На рис.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);
}
