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

Полезная методичка

.pdf
Скачиваний:
82
Добавлен:
01.04.2014
Размер:
1.09 Mб
Скачать

(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

 

 

 

 

QQ

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

- v6 lmet[t] = 3

 

 

 

 

(v1; 1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v2

 

 

l

3,3

 

 

 

 

-

 

v4

Hl

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4,3

>

 

 

Q

1,0

 

 

 

 

 

 

>

 

 

 

H

5,5

 

 

 

 

 

 

 

 

 

 

Q

QQ

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

QQ

 

 

 

 

 

 

 

 

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

Соседние файлы в предмете Структуры и алгоритмы обработки данных