Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги из ГПНТБ / Ху, Т. Целочисленное программирование и потоки в сетях

.pdf
Скачиваний:
43
Добавлен:
22.10.2023
Размер:
16.99 Mб
Скачать

 

10.1.

КРАТЧАЙШИЕ ЦЕПИ

193

a Nj — тот

из узлов Ni

дерева, на

котором достигается

этот

минимум:

L'sr —rain (LSi +

(!&) = Lsj +

djr. Покажем, что

тогда

L sr’ =

 

i

 

 

 

 

 

 

 

Lsr, а дуга A jr должна принадлежать искомому дереву.

 

Рассмотрим произвольную цепь из узла

N s

в

узел

N r. Так

как

узел N s принадлежит

текущему

дереву,

а

узел

N r

ему

не принадлежит,

то всегда можно найти в рассматриваемой цепи

первый узел N k,

не принадлежащий дереву

(в частности, таким

узлом N h может

оказаться сам узел N r). Из

определения L'Sk сле­

дует,

что любая

цепь из

N s в N r,

проходящая через узел

Nk,

будет не короче, чем Ыи (здесь используется предположение, что

все расстояния d i ^ 0 ;

в противном случае участок цепи из

N k

в N r

может оказаться

отрицательным).

А так как L Sk^L'sr,’

то

длина

рассматриваемой

цепи из N s в

N T будет не короче, чем

L'sr. Но цепь имеет длину, равную в точности L'sr. Следовательно, L'sr — Lsr, и дуга Ajr должна быть включена в число дуг дерева.

(Заметим, что на последующих

шагах

алгоритма величина L'sr

не может стать меньше, чем Lsr-)

дуг дерева увеличивается

На каждом шаге алгоритма

число

на единицу, при этом величины Ь& должны быть пересчитаны для всех узлов, соседних с вновь построенным деревом. Для этого имеющаяся величина L'sk сравнивается с величиной Lsr + drk- Если

Lsr + dru < L'sh,

то

параметру

L'Sk

присваивается значение Lsr+

+ dru, если

же

L

s t + dTk^ L'st

то

L'sk остается без изменения.

Символически это записывается в следующем виде:

 

 

 

 

 

 

 

L ’sk : = min {L'sk,

Lsr+ dTk),

 

 

(1)

где символ : = обозначает оператор присвоения.

 

 

 

Теперь можно привести весь алгоритм решения задачи.

 

Ш аг

0.

Положить,

что узел N s принадлежит дереву;

Lss = 0;

для соседних с N s узлов Lsh = dsk,

для

остальных

= оо.

 

Ш аг

1.

Положить

Lsr = min L sh’ =

Lsj + djr,

где N h— все

 

 

 

 

 

 

h

Дугу AjT включить

в

число

узлы, соседние с текущим деревом.

дуг дерева.

 

 

 

 

 

 

 

 

 

 

Ш аг

2.

Если число дуг дерева равно п — 1, то

конец.

Если

нет, перейти к шагу 3.

Ш аг 3. L'Sk : = m in(Z4, Lsr+ drft). Перейти к шагу 1.

Этот алгоритм может быть осуществлен при помощи расста­ новки пометок. Каждый узел N h получает пометку вида (L, i). Первая часть пометки —это величина L'Sh или Lsh, а вторая часть указывает соседний с N k узел в кратчайшей цепи из N s в N h. Пометка называется временной, если она имеет вид(А^, i), и постоян-

13 Т . Х у

194 ГЛ. 10. КРАТЧАЙШИЕ ЦЕПИ И ПОТОКИ МИНИМАЛЬНОЙ СТОИМОСТИ

ной, если она имеет

вид (Lsft,

г). Вначале каждый узел N h, сосед­

ний с узлом N a, получает временную пометку (dsft, s) =

( L s h , s ) .

Если Lsr = min L'Sh,

то узел

N T получает постоянную

пометку

ь

 

 

 

S) = (Bsr, s).

 

 

 

Подсчитаем, какое число операций сложения и сравнения тре­ буется для выполнения алгоритма. На шаге 3 нужно выполнить не более п операций сложения и п операций сравнения, чтобы получить временные пометки. На шаге 1 нужно выполнить еще не более п сравнений, чтобы получить постоянную пометку. Таким

образом, требуется самое большее 3п операций, чтобы найти одну постоянную пометку. Так как в сети имеется п узлов, то для нахождения кратчайшей цепи потребуется самое большее 3/г2 опе­

раций.

Рассмотрим сеть, изображенную на рис. 10.1, где числа рядом с дугами выражают расстояния. Линии без стрелок обозначают неориентированные дуги; считаем, что у неориентированных дуг

dtj

= dji. Найдем кратчайшую цепь в этой сети.

узлы Ад,

 

 

Вначале

все

дуги сети не принадлежат дереву:

N z,

N 3—соседние

с

узлом

N s.

Присваиваем

временные пометки:

(Ыи s) = (4, s)

узлу N u (3,

s) —узлу N 2,

(1, s) — узлу N 3.

Так

как

min (4,

3,

1 ) = 1 ,

то пометка

(1, s) становится постоянной

пометкой узла N 3,

а дуга А $3

становится дугой дерева. Значит,

пока найдена только одна дуга дерева Л53.

 

 

 

 

Теперь

узлами, соседними

с деревом, являются N u Лг2,

 

N 3.

Присваиваем им временные пометки:

 

 

 

 

Lsi- = m in(Ln, Ls3 + d3i) = min (/Bl + oo)

= 4 ,

 

 

Ls2 - —min (Bs2 , Ls3-\-d32 ) =

min (3,1 -f-1)

= 2 ,

 

 

Ls4: = min(Ls4 , L S3 +

d3i) =

min (oo,

1 -f oo) = oo,

 

 

Ls5: =

min(Ls5, Ls3 +

d3b) =

min (oo,

8 )

==8 .

 

10.1. КРАТЧАЙШИЕ ЦЕПИ

195

Наименьшей из этих пометок является L's2, следовательно, она становится постоянной, а дуга А 32 становится дугой дерева. Теперь текущее дерево состоит из двух дуг. Продолжим вычисле­ ния:

LA- =

min (Lsi, Ls2 + <32i) =

min(4,

2 +

2)

= 4 ,

Ls4: =

min(Ls'4, Ls2 +

d2i) = min (oo,

2 + 5)

=

7,

Ls5i =

min(Ls5 , b s2 +

d25) =

m in(8 ,

2

+

oo)

=

8 .

Наименьшей из этих пометок является Ls4,’ следовательно, она становится постоянной, а дуга A si становится дугой дерева. Далее,

 

Ls4: =m in(L s4, Lsl +

di4) = min(7,

4 +

2)

 

= 6 ,

 

Ls6: =

(L'sb, Lsi + di&)

=

min (8 ,

4 + 4)

 

= 8 .

Теперь

Lk становится постоянной

пометкой,

а

дуга A lk—дугой

дерева.

Далее

 

 

 

 

 

 

 

 

 

 

L st:’ =

min (LU,

L s i+ du) = m in(oo,

6 +

4)

= 1 0 ,

 

Lss: =

min (L55,

Lsi +

d45) = min (8 ,

6 +

oo)

= 8 .

Теперь L'sb становится постоянной пометкой,

а дуга A ia

или Азь

может стать дугой дерева. Выберем А аа в качестве

дуги

дерева.

Тогда

 

 

 

Lst: = min (Lit, Ls6 + d+) = min (10,

8 + 1) =

9.

 

Следовательно, дуга A at становится дугой дерева, и на этом вычис­ ления заканчиваются. На рис. 10.1 дуги дерева выделены жир­ ными линиями, а пометки узлов указаны в скобках.

Описанный выше алгоритм можно использовать для нахожде­ ния не только кратчайших цепей, но и цепей, удовлетворяющих другим критериям оптимальности. Поэтому интересно определить, при каких критериях оптимальности этот алгоритм приводит к решению. Поставим в соответствие каждой дуге сети А ц произ

вольное число g tj . Пусть Ац, A i2, . . .,

A vl, A jh — произвольная

последовательность

дуг, образующая цепь. Обозначим

через

Gij (gu, .

. .,

.,

gPj)

значение

критерия

оптимальности

на

цепи

А п , А 12,

. .

A pj

из узла

N t в узел Л + а через Gih { g n ,

. . .,

• • .,

gPj,

gjk)

— значение

критерия

оптимальности

на

цепи

и.

А 12,

. .

 

Apj,

A jk из

узла N, в узел N k.

 

 

Если

в задаче

минимизации критерия оптимальности выпол-

няется условие

 

 

 

 

 

 

 

 

 

 

Gu ^ G ik,

 

 

(2 а)

а в

задаче

максимизации —

 

 

 

 

 

 

 

 

Gu ^ Gm ,

 

 

(26)

13*

196 ГЛ . 10. КРАТЧАЙШ ИЕ ЦЕПИ И ПОТОКИ МИНИМАЛЬНОЙ СТОИМОСТИ

то для решения задачи можно использовать описанный выше алгоритм.

В частности, если gц — di} и ищется кратчайшая цепь в сети, то

 

&ij (gii>

• ч gpj) — gil + gn +

• • • + gpj,

(3)

G t k ( g n ,

. . ., g p j , g j k ) = g i i + g n +

• • • + g p j + g j k ■

(4 )

Так как

di} ^

0,

то и з

(3) и (4) следует

условие (2а).

(2).

Приведем еще

один

пример, когда выполняется условие

Пусть gu

— это дуговые пропускные способности Ъ1}. Требуется

найти цепь, через которую можно пропустить наибольший поток

(задача о пути с

максимальной пропускной способностью [104]).

В этом случае

 

 

 

 

G u ( g t u

- ч g p j ) =

m in ( g i U

g i 2 , . .

g p J ) ,

G i k { g i h • *

ч g p j i g j k ) =

m ill { g i l i

g l 2 i • *

•> g p j i g j k ) '

Условие (26) здесь выполняется. Для того чтобы применить опи­ санный выше алгоритм, следует в качестве временной пометки L'sk принять величину макси­ мального потока, который можно пропустить из N s в N k\ выражение (1 ) следует заме­

нить на следующее:

L ’sk' max[Lsft, min(Lsr, brk)].

В качестве постоянной по­ метки Lsh следует взять мак­ симальную из временных пометок L'sh.

Аналогичные изменения в алгоритме следует проводить при решении других задач,

удовлетворяющих условиям (2). Следует отметить, что утвержде­ ние (2 ) является достаточным (но не необходимым) условием при­

менимости описанного выше алгоритма.

В заключение параграфа рассмотрим одно интересное и не совсем очевидное приложение задачи о кратчайшей цепи, а именно задачу нахождения минимального разреза в (s, ^-плоской сети [64].

Сеть называется плоской, если ее можно начертить на плоско­ сти так, чтобы все ее дуги пересекались только в узлах сети. Неориентированная плоская сеть называется (s, 1)-плоской, если после добавления к ней дуги A st она останется плоской. Напри­ мер, плоская сеть, изображенная на рис. 1 0 .2 , не является (s, t)-

плоской. Эта же сеть, но без дуги А 23, уже будет (s, ^-плоской. Рассмотрим (s, г)-плоскую сеть, которая получится, если из сети на рис. 10.2 удалить дугу А 23. Пусть числа рядом с дугами

10.1. КРАТЧАЙШИЕ ЦЕПИ

197

выражают их пропускные способности. Требуется найти мини­ мальный разрез, отделяющий узлы N s и N t.

Эта задача, конечно, может быть решена посредством нахож­ дения максимального потока с помощью метода расстановки поме­ ток. Но оказывается, ее можно решить проще: минимальный раз­ рез в исходной сети соответствует кратчайшей цепи в сети, двой­ ственной к ней х).

Двойственная сеть строится следующим образом. Сначала чер­ тится дуга A st, если Bi исходной сети этой дуги не было. Получится

плоская сеть с п узлами. Плоскость чертежа окажется раз­ деленной на грани (области, ограниченные ребрами и не содержа­ щие внутри себя ни вершин, ни ребер). Дуга A st будет разделять две грани, одна из которых является внешней. Поместим по одно­ му узлу в каждую из этих граней и обозначим их через N's и N t’. Аналогично, поместим по одному узлу в каждую из граней, раз­ деленных дугой A tj, и обозначим их через N\ и N ]. Проведем в двойственной сети дуги Ац, которые связывают узлы N\ и Nj.

*) Задача нахождения максимального потока в (s, г)-плоской сети проще, чем в общем случае, и эффективно решается (за О (п2) действий) без использования двойственной сети (см. [64], стр. 399).

Алгоритм поиска кратчайшей цепи в двойственной сети будет не сложнее (по числу действий) алгоритма нахождения максимального потока в исход­ ной сети, если число узлов в двойственной сети не превышает (по порядку) числа узлов в исходной цепи. Это действительно так: число узлов в двой­ ственной сети равно числу граней / в исходной сети, а в плоской сети / ^ ^ 2п — 4 (см., например, [18*]).Прим, перев.

198 ГЛ. 10. КРАТЧАЙШИЕ ЦЕПИ И ПОТОКИ МИНИМАЛЬНОЙ СТОИМОСТИ

Каждой дуге A tj исходной сети будет соответствовать дуга А\} двойственной сети. Каждому разрезу, разделяющему N s и N t в исходной сети, будет соответствовать некоторая цепь из N's в N't. Положим, что пропускная способность btj дуги A tj равна длине dtj дуги A'ij. В этом случае кратчайшая цепь из N's в Nt будет соответствовать минимальному разрезу, разделяющему N s и N t. Рис. 10.3 иллюстрирует описанное построение.

10.2. Многополюсные кратчайшие цепи (Флойд [63], Ху [111], Мерчленд [158], Уоршелл [209J)

В этом параграфе рассматривается задача нахождения крат­ чайших цепей между всеми парами узлов сети. Предполагается, как и в § 1 0 .1 , что длины йц могут не удовлетворять неравенству

треугольника и условию симметричности. В отличие от § 10.1

теперь величины dtj могут быть и отрицательными. При этом делается предположение менее ограничительное, чем условие da ^ 0 : сумма длин дуг по любому направленному циклу должна

быть неотрицательна (иначе понятие кратчайшей цепи теряет смысл). Заметим, что для любой неориентированной дуги A iS последнее предположение не менее ограничительно: из него сле­ дует, что dt] ^ 0 (поскольку неориентированную дугу можно рас­

сматривать как пару противоположно направленных дуг, каждая из которых имеет ту же длину, что и исходная неориентированная

Дуга).

Как отмечалось в § 10.1, задача оказалась бы тривиальной, если бы выполнялось неравенство треугольника dtj + djk ^ dth; в этом случае кратчайшей цепью между произвольной парой узлов 7V, и N j была бы сама дуга Ац. В произвольной сети лишь некото­ рые дуги А и являются кратчайшими цепями из N t в Np, такие дуги будем называть базисными. Заметим, что в § 10.1 все дуги дерева были базисными (обратное неверно).

Предположим, что известна кратчайшая цепь, скажем, из узла N p в узел N q. Тогда эта цепь должна состоять только из базисных дуг, в противном случае она не будет кратчайшей. Если теперь

ввести

дугу A pq

с длиной,

равной

длине

рассматриваемой цепи

из N p

в N q, то

эта дуга

А РЧ будет базисной.

Задачу нахождения кратчайших

цепей

между всеми парами

узлов можно решить, добавив базисные дуги (если таких дуг в сети не было) между всеми парами узлов. При добавлении базисной дуги ей ставится в соответствие длина, равная длине кратчайшей цепи, состоящей из базисных дуг исходной сети.

Рассмотрим следующую операцию, определенную для фикси­

рованного узла N р.

 

dik: = m in(dih, dtj + dJh) (для всех 1 ф к ф ] ) .

(1 )

Эту операцию будем называть тернарной.

 

10.2. МНОГОПОЛЮСНЫЕ КРАТЧАЙШИЕ ЦЕПИ

199

При осуществлении операции (1) сравнивается длина dih дуги A ik и длина цепи N t Nj N k, а затем длине дуги A ih присваи­ вается значение йц + djk, если dik > di} + djk.

Оказывается, что если выполнить операцию (1) последователь­ но для каждого узла Nj (j = 1 , 2 , . . ., п), то полученные в ре­

зультате значения d^ будут длинами кратчайших цепей между

А

Р и с . 10.4

всеми парами узлов. (Заметим, что при этом общий объем вычисле­ ний не превышает п (п 1 ) (п 2 ) действий сложения и срав­

нения.)

Идея доказательства этого факта заключается в следующем. Каждая кратчайшая цепь должна состоять из базисных дуг исход­ ной сети. Значит, надо доказать, что в результате выполнения алгоритма будет получена базисная дуга, длина которой равна сумме длин базисных дуг, входящих в кратчайшую цепь. Рас­ смотрим произвольную кратчайшую цепь; например, одна такая цепь представлена на рис. 10.4. При выполнении операции (1) в сеть будут последовательно добавляться базисные дуги, изобра­ женные пунктиром на рис. 10.4. Так как сумма расстояний по любому направленному циклу в сети неотрицательна, то понятие кратчайшей цепи между любыми двумя узлами имеет смысл. Если при выполнении операции (1) получится дуга А рд, длина которой больше кратчайшего расстояния между N p и N q, то на некотором дальнейшем шаге длина этой дуги обязательно изменится и станет равной кратчайшему расстоянию между N p и N q х). После этого величина dpq уже не будет изменяться, поскольку она не может*)

*) Более строго

доказательство можно провести следующим

образом.

П усть У j — промежуточный узел в кратчайшей цепи из У р в N q ,

имеющий,

наименьший индекс,

а У t и У ^ — два узла ,

соседних с У j в этой цепи. При

вычислениях по формуле (1) получится d ^

> di7- +

d j ^ ,

и мы введем новую

дугу A ih длины d tj +

d j h . Таким образом,

для дуги A ih

утверждение дока­

зано. Теперь заменим исходную кратчайшую цепь из У р

в У д другой, содер­

ж ащей новую д у гу A i h ' , эта цепь имеет ту же длину,

но меньшее число узлов.

Д а лее продолжаем рассуждения по индукции,— П р и м ,

иерее.

 

200 ГЛ. 10. КРАТЧАЙШИЕ ЦЕПИ И ПОТОКИ МИНИМАЛЬНОЙ СТОИМОСТИ

быть уменьшена. На рис. 10.4 показана произвольная кратчайшая цепь между узлами, скажем, N 2 и N 9, состоящая из базисных дуг А 24, А 46, А в1, A i3 и А 39. Если выполнить операцию (1) последо­

вательно для каждого узла N } (/ = 1, 2, . . ., 9, . . .), то новые базисные дуги будут появляться одна за другой: сначала И63, затем + в9, А 2в и А 29.

Чтобы проследить, какие дуги исходной сети входят в крат­ чайшую цепь, построим следующую справочную таблицу, которая заполняется по мере последовательного выполнения операции (1 ).

В самом начале элемент (i, к) таблицы, стоящий на пересечении i-й строки и к-то столбца, полагаем равным к. После выполнения операции (1 ) пусть элемент (t, к) ука­

зывает первый промежуточный узел в кратчайшей цепи между N t vi N k, если такой узел существует. Если такого промежуточного узла не существует, то полагаем элемент (i , к) равным к.

Таким образом,

 

 

Г(г,

;),

если dik > d i j +

djk,

 

l’ _ I (г\

&)>

если diks^.dij +

djk.

*

Во всех вычислениях мы до сих пор полагали, что dit = 0 для всех i. Если положить dn = оо для всех г, а в опе­ рации (1 ) разрешить, чтобы i = к, то

последовательное выполнение опера­ ции (1 ) дает возможность найти кратчайшие циклы, содержащие

узел N f Если при таких вычислениях величина du становится отрицательной, то это показывает, что в сети существует отрица­ тельный цикл (т. е. такой, у которого сумма длин входящих дуг отрицательна). Задача нахождения отрицательных циклов в сети имеет много различных приложений.

Рассмотрим сеть, изображенную на рис. 10.5; длины дуг ука­ заны в табл. 10.1. Необходимо найти кратчайшие цепи между всеми парами узлов.

Выполнение операции (1) при / = 1 заключается в том, что пересчитываются все элементы табл. 1 0 .1 , не лежащие в первой

строке или первом столбце. Имеем

d23: = min (d23, d2i + ^i3) = nim(oo, И + 30) = 41, d32 : = min (d32, d3i + dl2) = min (oo, 3 0 + 11) = 41;

все остальные элементы не изменяются.

Выполнение операции (1) при j = 2 заключается в том, что пересчитываются все элементы табл. 1 0 .1 , не лежащие во второй

10.2.

МНОГОПОЛЮСНЫЕ КРАТЧАЙШИЕ ЦЕПИ

201

 

 

 

Таблица 10.1

 

 

 

 

 

Ф

©

©

©

©

©

 

 

®

0

11

30

OO

CO

CO

00

 

 

 

 

 

 

( D

и

0

OO

12

2

oo

00

 

 

 

 

 

 

3 0

OO

0

19

CO

4

oo

 

 

00

12

19

0

11

9

oo

 

©

oo

2

OO

11

0

OO

oo

 

 

 

 

 

 

 

 

 

©

oo

OO

4

9

CO

0

00

 

 

 

 

 

 

 

 

 

 

oo

OO

OO

2 0

1

1

0

 

строке и втором столбце. Заметим, что при этом уже используются результаты вычислений при j — 1. Имеем

d3i: = min (d3i, d32

+

d2i) = min (19, 41

+

12) =

19,

di4 : = min (du, dl2

+ d 24)

=

min (oo,

11 +

12) =

23,

dlb: =■-min (d16, di2

+ d 2b)

= min (oo,

11

+

2) = 13 ,

d35: = min (d3&, d32

+ d2b) =

min (o o ,

41

+

2) = 43,

d43 d3i, d^ = dj4,

dbi =

c?i5, db3

= d35;

 

остальные элементы не изменяются.

Продолжая вычисления таким образом, окончательно получим табл. 1 0 .2 , в которой указаны длины кратчайших цепей, и справоч­

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

Пусть, например, нужно найти кратчайшую цепь из N t в N e. Тогда по табл. 10.3 сначала находим элемент (1 ,6 ) = 2 . Затем

находим (2,6) = 4

и (4,6) =

6 .

Следовательно, кратчайшая цепь

из Ni

в N e проходит через

узлы N 2, iV4.

В

общем случае

если нужно

найти кратчайшую цепь из N p

в N q, то по справочной таблице сначала находим элемент (р , q) = = к, который означает, что узел N h является первым промежуточ­ ным узлом в кратчайшей цепи из N p в N q. Затем находим элемент (к, q), который указывает первый промежуточный узел в кратчай­ шей цепи из N k в N q. Этот процесс продолжается до тех пор, пока не будет найден элемент (i, q) = q, который означает, что найдены

все узлы,

входящие в кратчайшую цепь из N p в N q, а именно

N P, N k,

. . ., N t, N q.

202 гл. 10. КРАТЧАЙШИЕ ЦЕПИ И ПОТОКИ МИНИМАЛЬНОЙ с т о и м о с т и

Таблица 10.2

 

ф

©

®

®

©

©

 

®

 

 

®

0

11

30

2 3

13

3 2

 

00

 

 

 

 

 

 

©

11

0

25

12

2

21

 

со

 

 

©

3 0

25

0

13

2 4

4

 

со

 

 

 

23

12

13

0

11

9

 

00

 

 

©

13

2

2 4

11

0

20

 

со

 

 

©

3 2

21

4

9

2 0

0

 

со

 

 

 

 

 

 

©

14

3

5

10

1

1

 

0

 

 

 

 

 

Таблица 10.3

 

 

 

 

 

 

®

©

©

©

©

©

 

©

 

 

ф

1

2

3

2

2

2

 

7

 

 

©

1

2

4

4

5

4

 

7

 

 

 

 

 

 

 

 

 

 

 

 

©

1

6

3

6

6

6

 

7

 

 

 

г

2

6

4

5

6

 

7

 

 

©

2

2

4

4

5

4

 

7

 

 

©

4

4

3

4

4

6

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

5

5

6

6

5

6

 

7

 

 

Докажем теперь, что выражение (2) определяет именно те

узлы, которые входят в кратчайшую

цепь.

Пусть N j — промежу­

точный узел

в кратчайшей цепи из N p в N g,

имеющий наимень­

ший индекс,

a N t и Nk — два узла,

соседние с узлом Nj в этой

кратчайшей цепи. При вычислениях получится:

d ih >

d tj

+ d jh,

и мы положим (i, к) = (г, j) = /. (Напомним,

что (i ,

j) с самого

начала вычислений

был

равен

/, и j — самый

меньший

индекс

узла в цепи.)

Так как А и и A jh являются базисными дугами, то

Соседние файлы в папке книги из ГПНТБ