Полезная методичка
.pdf(b)сли эт ршин р н у лял сь и кучи, то он и нориру тся;
(c)ðøèí v счит тся просмотр нной;
(d)ля ршины v н хо ятся н просмотр нны сос и w (они у мо ут ыть куч ) и о ляются кучу с приорит том p(w) := p(v) + c(v; w) .
Ç ì òèì, ÷òî
1.эл м нт ми кучи мо т ыть сл ующ я тройк чис л:
приорит т;
ном р ршины;
пр ш ст ующий эл м нт, т. . тот эл м нт, и которо онн я ршин ыл пом ч н ;
type zap=record prior:integer;
n_ver:integer; pred:integer; end;
var
heap:array[0..n] of zap;
Num:integer;
2.о н ршин мо т н сколько р стр ч ться куч ;
3.ршин ст но ится просмотр нной при п р ом у л нии и кучи; к ой ршин ст им соот тст и пот нци л, р ный тому приорит ту, который ыл у н при п р ом у л нии и кучи;
4.по торно у л ни ршины и кучи (он у р ньш ыл у л н и кучи, т к к к у н ыл ни приорит т) при о ит просто к и нориро нию нной ршины (т. . сос и но ляются кучу, пот нци л н и м ня тся);
5.колич ст о эл м нто куч о р нич но числом р р.
181
Тру о мкость л оритм поиск кр тч йш о пути р ф сть
O(jV j + jEj log jEj) .
Для и о р нно о ни н рисунк р ф , н о хо имо н йти кр тч йший путь и ст рто ой ршины s = 1 о с ршины,ости имы и н .
|
|
[1]2 |
|
|
||
|
|
|
Æ |
|
|
|
|
1 |
|
Z |
8 |
|
|
|
Z |
|
|
|
||
|
|
|
|
ZZ~ |
||
[0] |
1 |
|
||||
|
|
4 |
[7] |
|||
|
Æ |
|
3 |
Æ |
||
|
Q |
|
|
|
|
|
|
5Qs |
2 |
|
|
||
|
|
3Æ |
|
|
||
|
|
[5] |
|
|
|
Ни при о ится со р имо структуры нных "куч "н к ом ш л оритм н хо ния кр тч йш о пути р ф .
1.н ч льно состояни кучи: (приорит т=0, ршин =1, пр ш.=0);
2.ршин 1 просмотр н ; (приорит т=1, ршин =2, пр ш.=1); (приорит т=5, ршин =3, пр ш.=1);
3.ршин 2 просмотр н ; (приорит т=5, ршин =3, пр ш.=1); (приорит т=9, ршин =4, пр ш.=2);
4.ршин 3 просмотр н ; (приорит т=9, ршин =4, пр ш.=2); (приорит т=7, ршин =4, пр ш.=3);
5.ршин 4 просмотр н ; (приорит т=7, ршин =4, пр ш.=3);
182
Посл рш ния р оты л оритм с ршины, ости имы и ст рто ой ршины s = 1 , им ют пот нци л (н рисунк он - пис н н к ой и ршин к р тных ско к х). Пот нци лршины v это лин кр тч йш о пути и ст рто ой ршины s ршину v .
Для осст но л ния пути ост точно о но р м нно с пот нци - лом хр нить ном р той ршины, и которой нн я ршин получил с ой пот нци л (т. . корн о р о поиск по н ло ии с поиском лу ину), или и ти и ршины v о ршины s ïî ò ìó ì (x; y) , ля которых мо уль р ности пот нци ло ршин x è y р н стоимости у и (x; y) .
При м про р ммную р ли цию л оритм н хо ния кр тч йш о пути р ф .
d:prior:=0; d:n_ver:=s; d:pred:=0; insert_heap(d; H; Num; code);
for i:=1 to n do { visible[i]:=false; ptn[i]:=0; ptn_ver[i]:=0; } while Num 6= 0 do
{
d:= delete_min_heap(H; Num; code); if not (visible[d:n_ver]) then
{ ptn[d:n_ver] := d:prior; ptn_ver[d:n_ver] := d:pred; dop := gr[d:n_ver];
while dop =6 nil do
{
if not (visible[dop " :val]) then
{
z:prior := d:prior + dop " :c; z:n_ver := dop " :val; z:pred := d:n_ver;
insert_heap(z; H; Num; code);
}
dop := dop " :next;
}
visible[d:n_ver]:=true;
}
}
183
Для ния р ф ыли исполь о ны списки см ности.
type
uk=" el; el=record val:integer; c:integer; next:uk; end;
var gr:array[1..n] of uk;
6.4.МАКСИМАЛ Н Й ПОТОК В ГРАФЕ
Ïð ïîëî èì, ÷òî í ð ô G = (V; E) . Ê îé ó e 2 Eð ô G припис н н котор я пропускн я спосо ность c(e) . Вы-л ны ршины: s ( которую н т хо ящих у ) и t (и которой н т ыхо ящих у ). Т ким о р ом мы им м н которую с ть.
Потоком с ти н ы тся т к я функция f : E ! R , котор я у о л т оря т сл ующим с ойст м:
1.Поток по у н пр осхо ит пропускной спосо ности у и:
0 f(v; w) c(v; w) .
2.Колич ст о про укт , ыхо ящ о и ршины s , ð íî êîëè-
ч ст у про укт , хо ящ о ршину t : f(v1; t) + f(v2; t) +
+ : : : + f(vq; t) = f(s; u1) + f(s; u2) + : : : + f(s; up) .
3. Для к ой пром уточной ршины w (отличной от s è t ) колич ст о хо ящ о про укт р но колич ст у ыхо я- щ о про укт : f(v1; w) + f(v2; w) + : : : + f(vk; w) = f(w; u1) + + f(w; u2) + : : : + f(w; ul) .
В личиной поток н ы тся колич ст о про укт , ыхо ящ -о и ршины s .
Пр поло им, что н н котор я посл о т льность р- шин р ф
s = v1; v2; : : : ; vk = t;
184
ò ê ÿ, ÷òî (vi; vi+1) ó ëè î (vi+1; vi) у . То у и, н пр л ни которых со п т с н пр л ни м пути и s t ,у м н ы ть прямыми у ми, ост ши ся у и о р тными
(í ðèñ.6.4.4. ñ ó è êðîì ó è |
(v4; v3) прямы ). |
|||||
s |
|
|
t |
|
||
|
n |
n |
n |
n |
||
|
n v5 |
|||||
v1 |
- |
v2 |
- v3 |
v4 |
- |
|
|
|
Рис. 6.4.4.: Прямы и о р тны у и.
Н который путь н ы тся у личи ющим, сли прямы у-и н о ру ны f(v; w) < c(v; w) , поток по о р тным у м оль- ш нуля.
Поток н ы тся м ксим льным, сли с ти отсутст у т у - личи ющий путь.
Прост йший л оритм постро ния м ксим льно о поток состоит исполь о нии р сшир нно о ри нт поиск ширину (по прямым и о р тным у м). В проц сс поиск ршин м ст ятся м тки по опр л нному пр илу. Ко н о мо но пом тить кон чную ршину t , м ксим льный поток н й н.
Ïîì òêè ðøèí
В ршин s ст ится соот тст и м тк met[s] , р н я м кси- м льному колич ст у про укт ср и у , ыхо ящих и ршины s .
Пр поло им, что ршин v пост л н соот тст и м тк met[v] . Р ссмотрим сос ни с v н пом ч нны ршины. Во мо - н о н и сл ующих ситу ций:
Если (v; w1) у и f(v; w1) < c(v; w1) , то у (v; w1) н о ру н н личину c(v; w1) f(v; w1) . То ршин w1 ст ится м тк
met[w1] := min (jmet[v]j; c(v; w1) f(v; w1)) ;
185
р н я колич ст у про укт , которо мо т ыть ост л но
ршину w1 (с уч том то о, что ршину v îñò ë íî met[v] ïðî óêò ).
Åñëè (v; w1) ó è f(v; w1) = c(v; w1) , òî ðøèí w1 иршины v í ïîì ÷ òñÿ.
Åñëè (w2; v) î ð òí ÿ ó è f(w2; v) > 0 , òî ðøèí w2 ñò èòñÿ ì òê
met[w2] := min (jmet[v]j; f(w2; v)) :
т м тк соот тст у т м ксим льному колич ст у про ук- т , которо мо т ыть " ытолкнуто"и этой у и.
Если м тк ршины v поло ит льн я, то эт ршин ыл пом ч н по прямой у , сли отриц т льн я, то по о р тнойу .
Если р ульт т пом ток у тся пом тить ршину t , то су- щ ст у т у личи ющий путь и т кущий поток мо но у личить н личину met[t] .
У лич ни потоколь у личи ющ о пути
У лич ни поток оль у личи ющ о пути осущ ст ля тся сл ующим о р ом:
по прямым у м у личи м поток н met[t] ;
по о р тным у м ум ньш м поток н met[t] .
Т ким о р ом, прихо им к сл ующ му л оритму постро ния м ксим льно о поток .
Ал оритм постро ния м ксим льно о поток
0.В к ч ст н ч льно о поток ять нул ой поток.
1.Исполь уя р сшир нный поиск лу ину, р сст ить м ткиршин м, н чин я с ршины s , ïîê í ó ò ïîì ÷ í êî- í ÷í ÿ ðøèí t . Если ршину t пом тить н у тся, то н сущ ст у т у личи ющ о пути, т кущий поток я ля тся м ксим льным и л оритм к нчи т р оту.
186
|
|
(v1; 4) |
|
(v2; 3) |
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
v2 |
|
l 3,0 |
|
- |
v4 |
Hl |
|
5,0 |
|
|
|
||||
4,0 |
> |
|
|
Q1,0 |
|
> |
|
H |
|
|
|
|
|
|||||
|
1,0 |
|
|
|
QQQ |
|
|
1,0 |
|
HHjHv6 |
l |
|||||||
s v1 |
l |
|
|
|
|
Q |
|
|
|
|
|
|
|
|
1 |
|
||
|
Q |
|
|
|
|
|
|
Q |
|
|
|
|
|
|
|
|
||
6,0 |
sQ |
|
? 2,0 |
|
sQ |
? |
|
|
4 |
|
|
|||||||
|
|
|
|
- |
|
|
|
|
|
|
; 3) |
|||||||
|
|
Q |
|
|
|
l 3,0 |
|
|
|
v5 |
l |
|
6,0 |
(v |
||||
|
|
v3 |
|
|
|
|
|
|
|
|
||||||||
|
|
(v1; 6) |
|
(v2; 1) |
|
|
|
|
|
|
v1 l- v2 l- v4 l- v6 lmet[t] = 3
|
|
|
|
|
|
(v1; 1) |
|
|
|
|
(v3; 2) |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
v2 |
|
l |
3,3 |
- |
v4 Hl |
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
4,3 |
> |
|
Q1,0 |
|
> |
|
H 5,3 |
|
|
|
||||||||||||
|
|
|
|
|
|
|
Q |
|
|
|
|
HH |
|
|
||||||||||
s |
v1 |
|
|
l |
1,0 |
|
|
|
|
1,0 |
|
|
|
jHv6 |
t |
|||||||||
|
|
|
|
|
|
|
|
|
2,0 |
|
Q |
|
|
|
|
1 |
|
l |
||||||
|
|
|
Q |
|
|
|
|
|
|
|
|
Q |
? |
|
|
|
|
|
||||||
|
|
6,0 Q |
? |
|
sQ |
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
sQ |
|
|
|
|
- |
v5 6,0 |
|
|
|
||||||||||
|
|
|
|
|
|
v3 |
|
l |
|
|
|
|
(v4 |
; 2) |
||||||||||
|
|
|
|
|
|
|
3,0 |
|
|
|
|
l |
|
|
||||||||||
|
|
|
|
|
(v1; 6) |
l |
|
(v2 |
; 1) |
l |
|
|
|
|
||||||||||
|
|
|
|
l |
|
|
|
l |
|
|
|
|
|
|||||||||||
|
v1 |
|
|
- |
v3 |
|
- |
v4 |
|
- |
v6 |
met[t] = 2 |
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 6.4.5.: М ксим льный поток. Ит р ция 1,2.
2.Восст но ить у личи ющий путь и s t , исполь уя р -о поиск ширину.
3.У личить поток и s t н личину met[t] оль у ли- чи ющ о пути.
4.У р ть с м тки, припис нны ршин м, и п р йти к ш у 1 л оритм .
Опр лим м ксим льный поток с ти, и о р нной н рис.6.4.5.. Посл о т льность ит р ций л оритм н хо ния
187
|
|
|
|
(v1; 1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
v2 |
|
|
l |
3,3 |
|
|
|
|
- |
|
v4 |
Hl |
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
4,3 |
> |
|
|
Q |
1,0 |
|
|
|
|
|
|
> |
|
|
|
H |
5,5 |
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
Q |
|
|
|
|
|
|
|
|
HH |
|
||||||||||||||||||
s |
v1 |
|
|
1,0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1,0 |
|
|
|
|
|
|
|
jHv6 |
t |
||||||||
|
|
|
l |
|
|
|
2,2 |
|
Q |
Q |
|
|
|
|
|
|
|
|
|
|
|
|
1 l |
|||||||||||||
|
|
|
Q |
|
|
|
|
|
|
|
|
|
|
? |
|
|
|
|
|
|
||||||||||||||||
|
6,2 |
Q |
|
? |
|
|
|
|
|
sQ |
|
|
|
|
|
|
|
|
(v5; 1) |
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
|
|
|
|
sQ |
|
|
|
|
|
|
|
|
|
|
|
- |
|
v |
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
l 3,0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
v3 |
|
|
|
|
|
|
|
|
|
|
|
|
5 |
l |
|
6,0 |
|
|
|
||||||||||||
|
|
|
|
(v1; 4) |
|
|
|
|
|
|
|
|
(v2; 1) |
|
|
|
|
|
|
|
|
|||||||||||||||
|
v1 |
|
|
|
- |
v2 |
|
|
- |
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
|
|
|
|
||||
|
|
l |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
l |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
v5 |
|
l |
|
|
v6 |
|
|
|
met[t] = 1 |
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
l |
|
|||||||||||||||
|
|
|
|
|
v2 |
|
|
3,3 |
|
|
|
|
- |
v4 |
l |
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
4,4 |
> |
|
Ql1,1 |
|
|
|
|
|
|
> |
|
HH5,5 |
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
Q |
|
|
|
|
|
|
|
|
|
|
|
|
HH |
|
|||||||||||||
s |
v1 |
|
|
1,0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1,0 |
|
|
|
|
|
|
|
jHv6 |
t |
||||||||
|
|
|
l |
|
|
|
2,2 |
|
Q |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
l |
|||||||
|
|
|
Q |
|
|
|
|
|
|
|
|
Q |
|
|
|
|
? |
|
|
|
|
|
|
|
||||||||||||
|
|
6,2Q |
|
? |
|
|
|
|
|
|
sQ |
|
|
|
|
|
|
|
(v5; 3) |
|||||||||||||||||
|
|
|
|
sQ |
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
6,1 |
|
|
||||||||||||
|
|
|
|
|
v3 |
|
|
l 3,0 |
|
|
|
|
|
|
|
|
v5 |
l |
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
(v1; 4) |
|
|
|
|
|
|
|
|
(v3; |
3) |
|
|
|
|
|
|
|
|
|
v1 l - v3 l - v5 l
Рис. 6.4.6.: М ксим льный поток. Ит р ция 3,4.
188
|
|
|
v2 |
|
l 3,3 |
- |
v4 |
Hl |
|
|
|
||||
|
4,4 > |
|
|
Q1,1 |
> |
|
|
H5,5 |
|
||||||
|
|
|
|
|
|
||||||||||
s |
v1 |
1,0 |
|
|
|
QQQ |
|
1,0 |
HHjHv6 |
t |
|||||
|
|
l |
|
|
|
|
2,2 |
Q |
|
|
|
|
1 |
l |
|
|
|
Q |
|
|
? |
Q |
|
? |
|
|
|
||||
|
|
6,5Q |
|
|
sQ |
|
|
|
|||||||
|
|
sQ |
|
|
|
|
|
- |
v5 |
|
|
|
|||
|
|
|
|
|
|
|
l 3,3 |
|
|
|
|||||
|
|
|
v3 |
|
|
|
|
|
l |
6,4 |
|
(v1; 1)
Рис. 6.4.7.: М ксим льный поток. Ит р ция 5.
м ксим льно о поток проиллюстриро нн н рис.6.4.5. 6.4.7..
Äëÿ ê îé ó è (v; w) с ти ук ны: пропускн я спосо ность c(v; w) и поток f(v; w) .
Í ê îé èò ð öèè ðøèí v ñò èòñÿ ñîîò òñò è
личины: ном р ршины, и которой нн я ршин ыл пом - ч н , и м тк met[v] , óê íí ÿ ûø .
Н 5 ит р ции мо но пом тить только тр тью ршину, т. . р- шин t = 6 ост н тся н пом ч нной. Сл о т льно, постро нный н 4 ит р ции поток я ля тся м ксим льным, и о личин р н 9.
При м про р ммную р ли цию л оритм н хо ния м ксим льно о поток с ти.
189
pr:=false; repeat
for i:=1 to n do { met[i] := 0; path[i] := 0; } met[s] := 1; in_ocher(s);
while (nach 6=nil) and (met[t] = 0) do
{
v := out_ocher; dop_out := m_out[v];
while (dop_out 6=nil) and (met[t] = 0) do
{
w := dop_out " :val;
if (met[w] = 0) and ((dop_out " :c dop_out " :f) > 0) then
{met[w] := dop_out " :c dop_out " :f;
if met[w] >abs(met[v]) then met[w]:=abs(met[v]); path[w] := v; in_ocher(w);
}
dop_out := dop_out " :next;
}
dop_in := m_in[v];
while (dop_in 6=nil) and (met[t] = 0) do
{w := dop_in " :val; dop_out := m_out[w];
while dop_out " :val 6= v do dop_out := dop_out " :next;
if (met[w] = 0) and (dop_out " :f > 0) then
{ met[w] := dop_out " :f;
if met[w] >abs(met[v]) then met[w]:=abs(met[v]);
met[w] := met[w]; path[w] := v;in_ocher(w);
}
dop_in := dop_in " :next; }
}
if met[t] = 0 then pr:=true else
{
d := met[t];w := t;v := path[w];
while (v 6= 0) do
{
if met[w] > 0 then
{ dop_out := m_out[v];
while dop_out " :val 6= w do dop_out := dop_out " :next;
dop_out " :f := dop_out " :f + d;
}
else
{ dop_out := m_out[w];
while dop_out " :val 6= v do dop_out := dop_out " :next;
dop_out " :f := dop_out " :f d;
}
w := v; v := path[w];
}
}
free_mem_och; until pr;
190