Главная  Полное построение алгоритма 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [ 47 ] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

в котором обходятся вершины этого дерева (они точно соответствуют последовательности значений W в DFS). Знак х под вершиной означает, что она уже просмотрена. Заметим, что, продвигаясь непрерывно

DFS [А) DFSm V W

DFS (6)

RETURN RETURN

RETURN RETURN

DFS (2)

DFS{3)

.(3)

"l

4 "

a"

"a

Рис. 3.5.4. Содержимое стека при реализации алгоритма DFS.

от данной вершины к первой непросмотренной вершине, DPS достигает нижней вершины дерева самым быстрым из возможных способов. Видно, что на рис. 3.5.6 у дерева T(G) ровно в два раза больше ребер, чем у G, и каждое ребро сети G встречается дважды в T(G).

Доказательство правильности алгоритма DPS может быть основано на следующих замечаниях:

1. Ребро прибавляется к Т только в том случае, если одна из его двух вершин еще не просмотрена. Это означает, что Т не может содержать цикла.

2. Если каждая из М-I вершин, отличных от начальной вершины, на самом деле проверена, то к Т прибавляется М-1 ребер.

3. Остовное дерево Т в сети G с М вершинами состоит из М-1 ребер, не образующих цикла.

С помощью этих замечаний вы можете попробовать построить доказательство правильности алгоритма DPS.

Завершим обсуждение алгоритма DPS анализом его сложности. Число операций, необходимых при работе алгоритма с сетью G= (V, Е), есть 0{}Е\), т. е. линейная функция от числа ребер в сети. Это следует из того факта, что алгоритм проходит каждое ребро G дважды и обработка любого ребра требует не больше 12 шагов. Также заметим, что к DPS производится в точности 1 V\ обращений.

Методу поиска по дереву в глубину следует противопоставить другой метод, известный как поиск в ширину. При поиске в ширину



PR06RftH SPftN tINPOT»OUTPUT,TAPE5iINPUTiTftPE6=0UTPUTI

С ЭТА ПРОГРАММА НАХОДИТ ОСТОВНОЕ ДЕРЕВО В НЕВЗВЕШЕННОЙ СЕТИ G. С ОНА ИЛЛЮСТРИРУЕТ ПРЕДСТАВЛЕНИЕ СЕТИ СВЯЗАННЫМ СПИСКОМ И, С В ПОДПРОГРАММЕ DFS, ИСПОЛЬЗОВАНИЕ СТЕКА КАК СРЕДСТ8А С РЕАЛИЗА11КИ РЕКУРСИВНОГО АЛГОРИТМА НА ФОРТРАНЕ. С

с ПЕРЕМЕННАЯ. ОПИСАНИЕ

С ADJ (К) МАССИВЫ ДЛЯ ЗАПОМИНАНИЯ Р СВЯЗАННЫХ СПИСКОВ

С MEXTIK) ВЕРШИН, СМЕ)НЫХ С ДАННОЙ. ДЛЯ 1 .LE. К .LE.P

С ADJ(K> = О, И ЕСЛИ J = NEXT(K), ТОГДА ADJ(J)-nEPBAB

d ВЕРШИНА, СМЕЖНАЯ С К. СЛЕДУЮЩАЯ ВЕРШИНА,

С СМЕЖНАЯ С К, СОДЕРЖИТСЯ В ADJ QNEXTCJ)), .И Т.Д.

С TPEE(Jill J-E РЕБРО, ВЫБРАННОЕ ДЛЯ ОСТОВНОГО ДЕРЕВА.

С TREE(Ji2)

С р «I число ВЕРШИН И РЕБЕР, СООТВЕТСТВЕННО, В С.

С ВЕРШИНЫ G ПОМЕЧЕНЫ 1, 2, .... Р.

.с Ui U РЕБРО В е МЕЖДУ ВЕРШИНАМИ UHV.

с WORDS WORDS = Р + Z*tt, ЧИСЛО СЛОВ ПАМЯТИ ДЛЯ МАССИВОВ

С AOJ П NEXT.

С"

INTEGER Р. Qt Т« и. М, VOROS

INTEGER ADJdOOOli NEXTllOOOli TREE(100i2)

С СЧИТЫВАНИБ ЧИСЛА ВЕРШИН И РЕБЕР 6.

READ(S«1000» P«Q 1000 FORMAT

I = Р + 1

uoRDs = p t г « ct

с ИНИЦИАЛИЗАЦИЯ МАССИеОВ ADJ и NEXT.

DO ЮО И = It Р ADJ(n) = О NEXTtH! = О 100 CONTINUE

с СЧИТЫВАНИЕ й РЕБЕР 6 И ОРГАНИЗАЦИЯ СВЯЗАННОГО .СПИСКА.

00 гой N = It а

READ (StlOOOl U,V NEXTCII ч NEXT(U> ADJdl s V UEXTIU) я I 1 = 1*1 WEXTdl = HEXTJV) ADJdl = и

. WEXT(V» = I 1 = 1 + 1 200 CONTINUE

С ВЫЗОВ DFS ДЛЯ НАХОЖДЕНИЯ ОСТОВНОГО ДбРЕВА G,

С НАЧИНЯЯ С V=l. DFS ПОМЕСТИТ РЕБРА ОСТОВНОГО ДЕРЕВА

С В МАССИВ TREE.

CAUU DFs f AOJt NEXTt It TREEt Pt WORDSt T ) С ПЕЧАТЬ СЕТИ Q И ОСТОВНОГО ДЕРЕВА е.

Рис. 3.5.5. Реализация алгоритма DFS на Фортране. (Текст в операторе 2000: «Представление списком сети G»; 2100: «Ребра остовного дерева»; 2300: «Заметим, что сеть не связная»; 1000: «Ошибка в подпрограмме DFS>>.)



WRITE (6i2000) (l.ADjdJ.NExTd). I = 1,WORDS) 2000 FORMAT t ХНИЗвН THE LIST REPRESENTATION OF NETWORK G > Л + 23H I ADJ NEXT </. { IHOt I8i lEi !£) )

write: (612100) 2100 FORMAT { 1H1,22H SPANfJINS TREE EDGES )

К = T - 1

WRITE (6f2200) (( TREEdiJIi J=l«2)i IsitK S 2200 FORMAT ( IHOi I10« I6 ) С •♦

IF I T ,E(J, P I STOP

WRITE {б«азоо)

2300 FORMAT { 1H1,41H NOTE THAT THE NETWORK IS NOT CONNECTED. )

STOP END

SUBROUTINE DFS С ADJ. NEXTi Ut TREE. Pi WORDS. T I

ПРИМЕНЕНИЕ РЕКУРСИВНОГО АЛГОРИТМА ТАРЬЯНА ПОИСКА В ГЛУБИНУ. DFS НАХОДИТ ОСТОВНОЕ ДЕРЕВО СВЯЗАННОЙ-НЕВЗВЕШЕННОИ СЕТИ G, ИМЕЮЩЕЙ Р .LE. 100 ВЕРШИН И й РЕБЕР. G ПРЕДСТАВЛЕНА СВЯЗАННЫМИ СПИСКАМИ, С ИСПОЛЬЗОВАНИЕМ МАССИВОВ AOJ(WOBOS) И NEXT (WORDS), ГДЕ WORDS = Р-Н 2*Q. DFS ПОМЕЩАЕТ ВЫБРАННЫЕ для ОСТОВНОГО ДЕРЕВА РЕБРА В МАССИВ TREE И НАЧИНАЕТ ПОИСК ОСТОВНОГО ДЕРЕВА В ВЕРШИНЕ V. ЕСЛИ G НЕ СВЯЗАНА, DFS НАЙДЕТ ОСТОВНОЕ ДЕРЕВО СВЯЗНОЙ КОМПОНЕНТЫ G, СОДЕРЖАЩЕЙ V. DFS МСЩЕЛИРУЕТ СТЕК, ЧТОБЫ РЕАЛИЗОВАТЬ РЕКУРСИНЗ В АЛГОРИТМЕ.

ПЕРЕМЕННАЯ ОПИСАНИЕ

V В ЛЮБОЙ МОМЕНТ РАССИАТТИВАЕМ ВЕРШИНУ V.

М СЛЕДУЮЩАЯ ВЕРШИНА, СМЕЖНАЯ С V.

VISIT(VI=I ОЗНАЧАЕТ, ЧТО V БЫЛА 1-Й ВЕРШИНОЙ, ПРОСМОТРЕННОЙ ВПЕРВЫЕ. VISIT(.V) = 0 ОЗНАЧАЕТ, ЧТО V ЕЩЕ НЕ ПРОСМОТРЕНА.

STORE СТЕКИСПОЛЬЗОВАН для ЗАПОМИНАНИЯ ПРОШЛОЙ

ПОСЛЕДОВАТЕЛЬНОСТИ ПРОСМОТРЕННЫХ ВЕРШИН. СТЕК НУЖЕН, ЧТОБЫ ЗАПОМНИТЬ ТЕКУЩУЮ ВЕРШИНУ V и ЗАПОМНИТЬ, НАСКОЛЬКО ПРОДВИНУЛСЯ УКАЗАТЕЛЬ к в СПИСКЕ СМЕЖНОСТИ V. ЕСЛИ Р .LE. 100, ТО В СТЕКЕ не БУДЕТ ХРАНИТЬСЯ БОЛЕЕ 200 ЭЛЕМЕНТОВ.

PTR УКАЗАТЕЛЬ НА ВЕРХ СТЕКА.

Т- СЧЕТЧИК ЧИСЛА РЕБЕР В ОСТОВНОМ ДЕРЕВЕ.

К УКАЗАТЕЛЬ, ИСПОЛЬЗУЕМЫЙ ПРИ ПРОХОЖДЕНИИ

СВЯЗАННЫХ СПИСКОВ СМЕЖНОСТЕЙ.

INTEGER Р. PTR. Т. V. U. WORDS INTEGER ADJ(W0RDS1. NEXT(W0RDS1, STORE(200l. TREE«lO0i2) INTEGER VlSITtlOB)

С ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ.

00 100 I s 1,100 VISIT(I) = 0

100 CONTINUE PTR = 0 T = I



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [ 47 ] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

0.0012