Файл: Ху, Т. Целочисленное программирование и потоки в сетях.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 15.10.2024
Просмотров: 211
Скачиваний: 0
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 являются базисными дугами, то |