Пути в бесконтурном графеПусть дан ориентированный граф G=<V,E> без контуров, веса дуг произвольны. Результатом является — массив кратчайших расстояний (длин) D от фиксированной вершины s до всех остальных. Утверждение — в произвольном бесконтурном графе вершины можно перенумеровать так, что для каждой дуги (i, j) номер вершины i будет меньше номера вершины j. Пример.Введем следующие структуры данных: массив NumIn, NumIn[i] определяет число дуг, входящих в вершину с номером i; массив Num. Num[i] определяет новый номер вершины i; массив St, для хранения номеров вершин, в которые заходит нулевое количество дуг. Работа с массивом осуществляется по принципу стека; переменная nm, текущий номер вершины. Идея алгоритма. Вершина i, имеющая нулевое значение NumIn (а такая вершина на начальном этапе обязательно есть в силу отсутствия контуров в графе), заносится в St, ей присваивается текущее значение nm (запоминается в Num), и изменяются значения элементов NumIn для всех вершин, связанных с i. Процесс продолжается до тех пор, пока St не пуст. На рисунке 6 приведен пример графа, а в таблице 3 представлены результаты трассировки работы алгоритма для этого примера.
Рис. 6 Таблица 3
Procedure Change_Num; { *A, Num — глобальные струк туры данных. *} Var NumIn,St:Array[1..N] Of Integer; i,j,u,nm,yk:Integer; Begin FillChar (Numln,SizeOf (Numln) ,0) ; For i:=2 To N Do For j:-1 To N Do If A[i,j]<>0 Then Inc (Numln (j}) ; nm:=0;yk:=0; For To N Do If Numln [i]=0 Then Begin Inc (yk);Stack[yk]:=i; End; While yk<>0 Do Begin u:=Stack[yk];Dec[yk];Inc(nm);Num[u]:=nm; For i:=1 To N Do If A[u,i]<>0 Then Begin Dec(Numln[i)); If Numln [i] =0 Then Begin Inc(yk); Stack (yk} ;=i; End; End; End; End; Итак, пусть для графа G выполнено условие утверждения (вершины перенумерованы) и нам необходимо найти кратчайшие пути (их длины) от первой вершины до всех остальных. Пусть мы находим оценку для вершины с номером i. Достаточно просмотреть вершины, из которых идут дуги в вершину с номером i. Они имеют меньшие номера, и оценки для них уже известны. Остается выбрать меньшую из них. Procedure Dist;(*D, А - глобальные величины.*} Var i, j : Integer; Begin D[1]:=0; For i:=2 To N Do D[i] : =МахInt-<максимальное значение в матрице смежности А>;{*Определите, с какой целью вычитается из Maxlnt максимальный элемент матрицы А. *} For i:=2 То N Do For j :=1 To i-1 Do If A[j,i]<> Then D[i] :=Min (D[i] ,D[j] +A[j, i]) ; End; Процедура написана в предположении о том, что i и j — новые номера вершин и A[i,j] соответствует этим номерам. Однако это не так. Новые номера по результатам работы предыдущей процедуры хранятся в массиве Num. Требуется «стыковка» новых номеров и матрицы А.
Поможем в написании учебной работы
|