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). Такой путь называется критическим путем. Его длина определяет время, необходимое для реализации всего проекта. Очевидно, что эта задача сводится к задаче о кратчайшем пути путем изменения знака каждого веса , где , на обратный.