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

Транзитивное замыкание

Во многих задачах интерес представляет только сам факт существования пути, длиной не меньше единицы, от вершины iдо вершиныj. Алгоритм Флойда можно приспособить для решения таких задач. Но полученный в результате алгоритм еще до Флойда разработал Уоршелл (S.Warshall), поэтому он называется алгоритмом Уоршелла.

По имеющейся матрице смежности Gтребуется вычислить матрицу А такую, чтоA[i,j]=1 тогда и только тогда, когда существует путь от вершиныiдо вершиныjдлиной не менее 1 иA[i,j]=0 в противном случае. Такую матрицу А называюттранзитивным замыканиемматрицы смежности.

1

2

3

1

1

1

1

2

1

1

1

3

1

1

1

Рис. 9. Транзитивное замыкание матрицы смежности орграфа из рис. 14

Транзитивное замыкание можно вычислить с помощью функции, подобной Floyd, применяя наk-м шаге следующую формулу к булевой матрице А:

Ak[i, j] = Ak-1[i, j] or Ak-1[i, k] and Ak-1[k, j]

Эта формула устанавливает, что существует путь от вершины iдо вершиныj, проходящий через вершины с номерами, не превышающимиk, только в следующих случаях:

  1. уже существует путь от вершины i до вершины j, который проходит через вершины с номерами, не превышающими k-1;

  2. существует путь от вершины i до вершины k, проходящий через вершины с номерами, не превышающими k-1, и путь от вершиныkдо вершиныj, который также проходит через вершины с номерами, не превышающимиk-1.

Здесь, как и в алгоритме Флойда, Ak[i,k]=Ak-1[i,k] иAk[k,j]=Ak-1[k,j], и вычисления можно выполнять в одной копии матрицы А.

Пример. Функция вычисления транзитивного замыкания

void Warshall (bool A[n][n], bool G[n][n])

{

int i, j, k;

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

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

A[i][j] = G[i][j];

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

A[i][i] = 0;

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

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

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

if (A[i][j] == false)

A[i][j] = A[i][k] && A[k][j];

}

Нахождение центра ориентированного графа

Пусть v– произвольная вершина орграфаG.Эксцентриситет(максимальное удаление) вершиныvопределяется как

ЦентроморграфаGназывается вершина с минимальным эксцентриситетом. Другими словами, центром орграфа является вершина, для которой максимальное расстояние (длина пути) до других вершин минимально. Так, для орграфа из рис. 14 центром будет вершина 3.

Алгоритм поиска центра орграфа:

  1. вычислить матрицу А кратчайших путей;

  2. найти максимальное значение в каждом столбце i матрицы А – эксцентриситет вершины i;

  3. найти вершину с минимальным эксцентриситетом – центр орграфа.

Обход ориентированных графов

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

Предположим, что есть ориентированный граф G, в котором первоначально все вершины помечены меткойunvisited(не посещалась). Поиск в глубину начинается с выбора начальной вершиныvграфаG, для этой вершины метка меняется наvisited(посещалась). Затем для каждой вершины, смежной сvи которая не посещалась ранее, рекурсивно применяется поиск в глубину. Когда все вершины, которые можно достичь из вершиныvбудут рассмотрены, поиск заканчивается. Если некоторые вершины остались не посещенными, то выбирается одна из них и поиск повторяется. Этот процесс продолжается до тех пор, пока обходом не будут охвачены все вершины орграфаG. Для представления вершин, смежных сv, можно использовать список смежностиL(v), а для определения вершин, которые ранее посещались – массивmark.

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

Рис. 10. Орграф и глубинный остовный лес для него

В добавление к дугам дерева существуют еще три типа дуг, определяемых в процессе обхода орграфа методом поиска в глубину. Это обратные(от потомков к предкам СА),прямые(от предков к потомкам (в данном примере их нет)) ипоперечныедуги (DC,GD)

Для неориентированных графов при поиске в глубину получается одно дерево. Ребра, соответственно, только ребра дерева иобратные(которые не являются ребрами дерева). /*Пример: Остовные деревья минимальной стоимости неориентированных графов*/

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

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