Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комб_2.doc
Скачиваний:
0
Добавлен:
16.09.2019
Размер:
177.66 Кб
Скачать

2.4.Пути в бесконтурном графе

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

Алгоритм 2.4 = proc (G:graph) returns (stack)

requires G не пуст

modifies G

effects 1.T = stack.new( ); num = 0

2.пока num < n

2.1.для i = 1 до n выполнить

2.1.1.c = graph.fetch(G,i); j = circ.size(c)

2.1.2.если j = 0, то

2.1.2.1.stack.pop(T,j); num = num + 1

2.1.2.2. для k = 1 до n выполнить

2.1.2.2.1. c = graph.fetch(G,i); m = circ.size(c)

2.1.2.2.2. для l = 1 до m выполнить

если circ.element(c) = j, то circ.delete(c),

иначе circ.change(c)

Рис.2.7.Алгоритм перенумерации вершин бесконтурного графа.

Алгоритм основывается на следующем факте: в произвольном (непустом) бесконтурном графе существует вершина, в которую не заходит ни одна дуга. В алгоритме 2.4 вершины, в которые не заходит ни одна дуга, накапливаются в стеке. Граф G содержит для всех вершин кольцевые структуры, каждая из которых включает номера начальных вершин входящих дуг. После включения вершины в стек она исключается из всех кольцевых структур графа.

Используя алгоритм 2.4, можно предположить, что при описании алгоритма нахождения путей в бесконтурном графе каждая дуга идет из вершины с меньшим номером в вершину с большим номером. Кольцевые структуры графа G в приведенном далее алгоритме 2.5 содержат помимо номеров вершин (n), из которых приходят направленные дуги, также веса дуг (a), что будет отражено в операции circ.element.

Алгоритм 2.5 = proc (G:graph) returns (D[n]:array of int)

requires G не пуст

effects 1.D[1] = 0;

2.для j = 2 до n выполнить D[j] =

3. для j = 2 до n выполнить

3.1.c = graph.fetch(G,j); k = circ.size(c)

3.2. для i = 1 до k выполнить

3.2.1.m = circ.element(c).n

3.2.2.D[j] = min (D[j}, D[m] + circ.element(c).a)

Рис.2.8.Алгоритм нахождения расстояний от источника до вершин бесконтурного графа.

Алгоритмы 2.4 и 2.5 достаточно удобны в методах управления выполнением проекта (PERT – Project Evaluation and Review Technique или CPM – Critical Path Method). Эти ме­тоды основываются на построении графа (сети PERT или сети CPM0, дуги которого соответ­ствуют некоторым элементарным задачам, составляющим проект, а их веса указывают на время, необходимое для решения отдельных задач. Кроме этого, предполагается, что для произвольных дуг этого графа и задача, изображаемая дугой , должна быть закон­чена перед началом решения задачи, изображаемой дугой . Подобный граф должен быть бесконтурным. Задачей является нахождение самого длинного пути из вершины s, соответствующей началу про­екта, до вершины t, соответст­вующей окончанию (рис.2.9). Такой путь называется критиче­ским путем. Его длина опреде­ляет время, необходимое для реализации всего проекта. Оче­видно, что эта задача сводится к задаче о кратчайшем пути путем изменения знака каждого веса , где , на обратный.