Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Высокоцровневые методы информатики и првые методы информатики и программированияограммирования.doc
Скачиваний:
337
Добавлен:
01.05.2014
Размер:
14.7 Mб
Скачать

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

Есть два стандартных способа представить граф G = (V, E) как набор списков смежных вершин или как матрицу смежности. Первый обычно предпоч- тительнее, ибо даёт более компактное представление для разреженных (sparse) графов – тех, у которых |Е| много меньше |V|2. Большинство излагаемых нами алгоритмов используют именно это представление. Однако в некоторых ситуаци- ях удобнее пользоваться матрицей смежности – например, для плотных (dense) графов, у которых |Е| сравнимо с |V|2. Матрица смежности позволяет быстро определить, соединены ли две данные вершины ребром.

Представление графа G = (V, Е) в виде списков смежных вершин (adjacency list representation) использует массив Adj из |V| списков – по одному на вершину. Для каждой вершины иV список смежных вершин Adj[u] содержит в произ вольном порядке (указатели на) все смежные с ней вершины (все вершины v, для которых (u, v) Е).

Рисунок 5.3 – Два представления неориентированного графа (списки смежности (б), матрица смежности (в))

Рисунок 5.4 – Два представления ориентированного графа (списки смежности (б), матрица смежности (в))

На рис. 5.3(б) показано представление неориентированного графа рис. 5.3(а) с помощью списков смежных вершин. Аналогичное представление для ориентированного графа рис. 5.4(а) изображено на рис. 5.4(б).

Для ориентированного графа сумма длин всех списков смежных вершин равна общему числу рёбер: ребру (uv) соответствует элемент v списка Adj[u]. Для неориентированного графа эта сумма равна удвоенному числу рёбер, так как ребро (и, v) порождает элемент в списке смежных вершин как для вер- шины и, так и для v. В обоих случаях количество требуемой памяти есть O(max(V, E)) = O(+ Е).

Списки смежных вершин удобны для хранения графов с весами (weight- ed graphs), в которых каждому ребру приписан некоторый вещественный вес (weight), то есть задана весовая функция (weight function) . В этом случае удобно хранить вес w(и, v) ребра (и, v Е вместе с вершиной v в списке вершин, смежных с и. Подобным образом можно хранить и другую информацию, связанную с графом.

Недостаток этого представления таков: если мы хотим узнать, есть ли в графе ребро из и в v, приходится просматривать весь список Аdj[u] в поисках v. Этого можно избежать, представив граф в виде матрицы смежности, но тогда потребуется больше памяти.

При использовании матрицы смежности (adjacency matrix) мы нумеруем вершины графа (V, Е) числами 1,2,..., |V| и рассматриваем матрицу А = () размера |V| |V| для которой

На рис. 5.3(в) и 5.4(в) показаны матрицы смежности неориентированного и ориентированного графов рис. 5.3(а) и 5.4(а) соответственно. Матрица смежно- сти требует памяти независимо от количества рёбер в графе.

Для неориентированного графа матрица смежности симметрична относи- тельно главной диагонали (как на рис. 5.3(в)), поскольку (uv) и (vu) – это одно и то же ребро. Другими словами, матрица смежности неориентированного графа совпадает со своей транспонированной (transpose). (Транспонированием называется переход от матрицы А = () к матрице , для которой .) Благодаря симметрии достаточно хранить только числа на главной диагонали и выше неё, тем самым мы сокращаем требуемую память почти вдвое.

Как и для списков смежных вершин, хранение весов не составляет проблемы: вес w(uv) ребра (uv) можно хранить в матрице на пересечении и-й строки и v-ro столбца. Для отсутствующих рёбер можно записать специальное значение NIL (в некоторых задачах вместо этого пишут 0 или ).

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

При решении многих задач, касающихся графов, необходимы эффективные методы систематического обхода вершин и ребер графов. К таким методам относятся:

  • поиск в глубину;

  • поиск в ширину.

Эти методы чаще всего рассматриваются на ориентированных графах, но они применимы и для неориентированных, ребра которых считаются двунаправленными.