Смекни!
smekni.com

Графы и их представление на ЭВМ (стр. 3 из 4)

G1ØG

Рис 3.6.1 Дополнение


Объединением графов G1(V1 , Е1) и G2(V2 , Е2) (обозначение - G1ÈG2, при условии V1ÇV1= Æ, Е1ÇЕ2 = Æ) называется граф G(V,E), рис. 3.6.3

V: = V2 ÈV1&Е : = Е1ÇЕ2


Рис. 3.6.3 Объединение графов

2.Соединением графов G1(V1 , Е1) и G2(V2 , Е2)(обозначение - G1(V1 , Е1)+ G2(V2 , Е2), при условии V1 ÇV2 называется граф G(V,E), где

V : = V1 ÇV2 &E : = Е1ÈЕ2 È{e = (v1, v2) êv1Î V1&v2Î V2}

3.Удаление вершины vиз графа G1(V1 , Е1) (обозначение - G1(V1 , Е1) – v, при условии vÎV1) даёт граф G2(V2 , Е2), где

V2 : = V1 \ {v}&E2 : = E1 \ {e = (v1 , v2) êv1 = v Ú v2 = v}

4.Удаление ребра eиз графа G1(V1 , Е1)(обозначение - G1(V1 , Е1)e, при условии eÎE1) даёт граф G2(V2 , Е2), где

V2 : = V1&E2 : = E1 \ {e}

5.Добавление вершины vв граф G1(V1 , Е1) (обозначение - G1(V1 , Е1) + v, при условии vÏV1) даёт граф G2(V2 , Е2), где


V2 : = V1È{v}&E2 : = E1

6.Добавление ребра eв граф G1(V1 , Е1) (обозначение - G1(V1 , Е1) + v, при условии eÏE1) даёт граф G2(V2 , Е2), где

V2 : = V1&E2 : = E1È{e}

7.Стягивание подграфа А графа G1(V1 , Е1) (обозначение - G1(V1 , Е1) / А, при условии А ÌV1) даёт граф G2(V2 , Е2), где

V2 : = (V1 \ A) È{v}&

E2 : = E1 \ {e = (u,w) êu Î A Ú w Î A}È{e = (u,v) êu ÎГ(А) \ А}


4. Представление графов в ЭВМ

Следует еще раз подчеркнуть, что конструирование структур данных для представления в программе объектов математической модели — это основа искусства практического программирования. Используется четыре различных базовых представления графов. Выбор наилучшего представления определяется требованиями конкретной задачи. Более того, при решении конкретных задач используются, как правило, некоторые комбинации или модификации указанных представлений, общее число которых необозримо. Но все они, так или иначе, основаны на тех базовых идеях, которые описаны в этом разделе.

4.1 Требования к представлению графов

Известны различные способы представления графов в памяти компьютера, которые различаются объемом занимаемой памяти и скоростью выполнения операций над графами. Представление выбирается, исходя из потребностей конкретной задачи. Далее приведены четыре наиболее часто используемых представления с указанием характеристики п(р, q) — объема памяти для каждого представления. Здесь р - число вершин, аq- число ребер. Указанные представления пригодны для графов и орграфов, а после некоторой модификации также и для псевдографов, мультиграфов и гиперграфов.

1. Матрица смежности. Представление граф с помощью квадратной булевской матрицы, отражающей смежность вершин, называется матрицей смежности,

M : array [1..p, 1..p] of 0..1,

M[i, j] = 1, если вершина viсмежна с вершиной vj

0, если вершины не viи vjсмежны.

Для матрицы смежности п(р, q) = O(p2).

2. Матрица инциденций. Представление графа с помощью матрицы H: array[1..p, 1..q] of0..1 (для орграфов H: array[1..p, 1..q] of-1..1), отражающей инцидентность вершин и рёбер, называется матрицей инциденций, где для неориентированного графа

H[i, j] = 1, если вершина viинцидентна ребру ej,

0, в противном случае.

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

1, если вершина viинцидентна ребру ejи является его концом,

H[i, j] = 0, если вершина viи ребро ejне инцидентны,

-1, если вершина viинцидентна ребру ejи является его началом

3. Списки смежности. Представление графа с помощью списочной структуры, отражающей смежность вершин и состоящей из массива указателей Г : array[1..р] оf­ N на списки смежных вершин (элемент списка представлен структурой N : recordv:1..р; п : ­N endrecord), называется списком смежности. В случае представления неориентированных графов списками смежности п(р, q) = О(р + 2q), а в случае ориентированных графов п(р, q) = О(р + q).

4. Массив дуг. Представление графа с помощью массива структур Е : array[1..р] ofrecordb,e: 1..pendrecord, отражающего список пар смежных вершин, называется мас сивом ребер(или, для орграфов, массивом дуг). Для массива ребер (или дуг) п(р, q) = О( 2q).

5. Обход графа — это некоторое систематическое перечисление его вершин (и/или ребер). Наибольший интерес представляют обходы, использующие локальную информацию (списки смежности). Среди всех обходов наиболее известны поиск в ширину и в глубину. Алгоритмы поиска в ширину и в глубину лежат в основе многих конкретных алгоритмов на графах.

ТЕОРЕМА Если граф Gсвязен (и конечен), то поиск в ширину и поиск в глубину обойдут все вершины по одному разу.

Доказательство

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

2.Завершаемость алгоритма. Всего в Т может попасть не более р вершин. На каждом шаге одна вершина удаляется из Т. Следовательно, алгоритм завершит работу не более чем через р шагов.

3.Обход всех вершин. От противного. Пусть алгоритм закончил работу, и вер шина wне обойдена. Значит, wне попала в Т. Следовательно, она не былаотмечена. Отсюда следует, что все вершины, смежные с w, не были обойденыи отмечены. Аналогично, любые вершины, смежные с неотмеченными, самине отмечены (после завершения алгоритма). Но Gсвязен, значит, существуетпуть (v,w). Следовательно, вершина vне отмечена. Но она была отмечена напервом шаге.

4.2 Реализация алгоритмов поиска в ширину и в глубину в программной среде TurboPascal

Задача состоит в том, найти путь из вершины A в вершину B. Будем задавать граф матрицей смежности, т.е. квадратной таблицей NxN, в которой на пересечении i-й строки и j-го столбца значение TRUE, если i и j соединены ребром, и FALSE в противном случае.

Поиск в ширину.

Подобно тому как, согласно принципу Гюйгенса, каждая точка волнового фронта является источником вторичной волны, мы, отправляясь из заданной вершины A, посещаем все смежные с ней вершины (т.е. вершины, в которые ведут стрелки из A). Каждая посещенная вершина становится источником новой волны и т.д. При этом необходимо позаботиться о том, чтобы не вернутся в ту вершину, в которой уже были. Для реализации алгоритма понадобятся: матрица m[1..n, 1..n] - матрица смежности графа; вспомогательный массив queue[1..n], в котором будет формироваться очередь, т.е. тип данных первый вошел – первый вышел (FIFO). Размер его достаточен, так как мы не посещаем вершины дважды. С массивом queue связаны две переменные - head и tail. В переменной head будет находиться номер текущей вершины, из которой идет волна, а при помощи переменной tail новые вершины помещаются в "хвост" очереди queue; вспомогательный массив visited[1..n], который нужен для того, чтобы отмечать уже пройденные вершины (visited[i]=TRUE <=> вершина i пройдена); вспомогательный массив prev[1..n] для хранения пройденных вершин. В этом массиве и будет сформирован искомый путь; переменная f, которая примет значение TRUE, когда путь будет найден. Кроме того, мы введем несколько вспомогательных переменных, которые понадобятся при организации циклов.