Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DM_2 / ОДМлек / СРМлек53.pps
Скачиваний:
55
Добавлен:
12.05.2015
Размер:
330.75 Кб
Скачать

16. Стираємо всі позначки.

17. Привласнимо вершині х1 позначку (+, ).

18. Вершини, суміжні вершині х1, не можна позначити, оскільки дуга (х1,х2) насичена—

(х1,х2)= (y1)=c(y1)=6, а через дугу (х3,х1) течія не передається. Стік залишився непозначеним. Отже, одержана течія є максимальною. Дуги (х1,х2) і (х3,х1)

утворюють мінімальний переріз. Множина позначених вершин утворює той його бік, який містить джерело: Xs={х1}. Непозначені вершині

утворюють інший бік перерізу, що містить стік: Xt={х2,х3,х4,х5}. Побудована течія має вигляд (y1)=6,

(y5)=8, (y6)=2, (y4)=2, (y3)=2, (y2)= (y7)=0.

Мережі з багатьма джерелами і стоками

Алгоритм Форда — Фалкерсона застосовний і для визначення величини максимальної течії між множиною вершин-джерел і множиною вершин-стоків.

Розіб'ємо множину вершин на множину джерел Х+={х X: Q(x)>0}, що створюють течію, множину

стоків Х-={х X: Q(x)<0}, що споживають течію і множину проміжних вершин Х0={х X: Q(x)=0}, що зберігають течію : X=Х+ Х- Х0. Перетворимо течію

у течію, яка має тільки одне джерело та один стік, збільшивши кількість вершин у мережі. Для цього додамо дві нові вершини — «фіктивне» джерело xs і

«фіктивний» стік xt.

З'єднаємо вершину xs зі всіма дійсними джерелами.

Цим дугам припишемо течію, що утворена відповідним джерелом. А від кожного дійсного стоку спрямуємо дугу до «фіктивного» стоку xt. Цим дугам

припишемо течію, що споживається відповідним стоком. При цьому пропускні здатності доданих дуг вважаємо нескінченними. В результаті одержуємо мережу з одним джерелом і одним стоком. Застосовуючи до неї алгоритм Форда — Фалкерсона, знаходимо максимальну течію, яка є максимальною і для вихідної мережі.

2

Задачу знаходження максимальної течії для всіх пар вузлів у неорієнтованій мережі можна розглядати як узагальнення задачі з одним джерелом і одним стоком і її можна розв'язати, застосовуючи алгоритм Форда

— Фалкерсона для кожної пари вершин. Але більш ефективним є алгоритм, що запропонований Р.Гоморі і Т.Ху.

Алгоритм Гоморі — Ху

1. Оберемо деякі дві вершини графа. Позначимо одну з них через xs, а іншу через xt.

2. Застосуємо алгоритм Форда — Фалкерсона і знайдемо максимальну течію з джерела xs у стік xt.

При цьому множина позначених вершин і множина непозначених вершин утворюють два боки мінімального перерізу Xs і Xt.

3. Оберемо дві вершини графа xi і xj що лежать з одного боку від перерізу. Наприклад, нехай xi, xj Xs.

4. Замінимо дуги з мінімального перерізу (Xs,Xt)

однією дугою, а вершини боку перерізу, в якому не лежать вершини xi, xj (наприклад, Xt), — однією

вершиною. Пропускну здатність у так визначеній дузі покладемо рівній пропускній здатності перерізу (Xs,Xt).

5. Покладемо: xi=xs, xj=xt, і повернемося до другого кроку.

Можна показати, що після того, як буде обрано n-1 пара вершин, ми визначимо всі n(n-1)/2 величин максимальної течії для вихідної мережі. Основна ідея алгоритму полягає в ітеративній побудові максимального остовного дерева, гілки якого відповідають перерізам, а пропускні здатності гілок дорівнюють пропускним здатностям цих перерізів.

Приклад реалізації алгоритму Гоморі — Ху. Числа, приписані дугам, відповідають їх пропускним здатностям. Треба для кожної пари вузлів мережі визначити величину максимальної течії між ними.

1. Оберемо вершини s=x1 і t=х2. Мінімальну пропускну здатність відносно джерела s=x1 і стоку

t=х2 має переріз (Xs,Xt) з боками Xs={x1, x3, x4, x5, x6} і Xt={x2}. За теоремою величина максимальної течії

між вершинами x1 і x2 дорівнює пропускній здатності перерізу (Xs,Xt):

v12=v21=c(Xs,Xt)=2+3=5.

Об'єднаємо вершини з Xs в одну вершину і з'єднаємо її з вершиною x2 гілкою з пропускною здатністю 5.

2. Оберемо вершини s=x1 і t=х3. Мінімальну пропускну здатність відносно джерела s=x1 і стоку

t=х3 має переріз з боками Xs={x1} і Xt={x2, x3, x4, x5, x6}. За теоремою величина максимальної течії між

вершинами x1 і x3 дорівнює пропускній здатності перерізу (Xs,Xt):

v13=v31=c(Xs,Xt)=2+4+2=8.

Об'єднаємо вершини x3, x4, x5, x6 в одну вершину і з'єднаємо її з вершиною x1 гілкою з пропускною здатністю 8.

3. Оберемо вершини s=x4 і t=х3. Мінімальну пропускну здатність відносно джерела s=x4 і стоку

t=х3 має переріз з боками Xs={x4} і Xt={x1, x2, x3, x5, x6}. За теоремою величина максимальної течії між

вершинами x4 і x3 дорівнює пропускній здатності перерізу (Xs,Xt):

v43=v34=c(Xs,Xt)=2+5+4=11.

Об'єднаємо вершини x3, x5, x6 в одну вершину і з'єднаємо її з вершиною x4 гілкою з пропускною здатністю 11.

4. Оберемо вершини s=x5 і t=х3. Мінімальну пропускну здатність відносно джерела s=x5 і стоку

t=х3 має переріз з боками Xs={x5} і Xt={x1, x2, x3, x4, x6}. Величина максимальної течії між вершинами x5

і x3 дорівнює пропускній здатності перерізу (Xs,Xt):

v53=v35=c(Xs,Xt)=5+4=9.

Об'єднаємо вершини x3, x6 в одну вершину і з'єднаємо її з вершиною x5 гілкою з пропускною здатністю 9.

5. Оберемо вершини s=x6 і t=х3. Мінімальну пропускну здатність відносно джерела s=x6 і стоку

t=х3 має переріз з боками Xs={x6} і Xt={x1, x2, x3, x4, x5}. Величина максимальної течії між вершинами x6

і x3 дорівнює пропускній здатності перерізу (Xs,Xt):

v63=v36=c(Xs,Xt)=5+2+4=11.

З'єднаємо вершину x3 з вершиною x6 гілкою з пропускною здатністю 11.

За останнім деревом перерізів легко знайти решту величин максимальних течій. Наприклад, v16=v61=8,

оскільки у ланцюгу дерева перерізів, що з'єднує вершини x1 і x6, мінімальна пропускна здатність гілок

дорівнює 8. Запишемо величини максимальних течій у вигляді матриці:

-

5

8

8

8

8

5

-

5

5

5

5

V= 8

5

-

11

9

11

8

5

11

-

9

11

8

5

9

9

-

9

8

5

11

11

9

-

Тут на перетині і-рядка і j-стовпця стоїть величина максимальної течії між вершинами xi і xj.

Соседние файлы в папке ОДМлек