Алгоритм Дініца

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Алгоритм Дініца — поліноміальний алгоритм для знаходження максимального потоку у транспортної мережі, запропонований 1970 року ізраїльським (колишнім радянським) ученим Юхимом Дініцем. І алгоритм Дініца, і алгоритм Едмондса-Карпа незалежно показують, що в алгоритмі Форда — Фалкерсона в разі найкоротшого доповнювального шляху його довжина доповнює шляху не зменшується. Часова складність алгоритму становить O(V2E). Отримати таку оцінку дозволяє введення понять допоміжної мережі та блокуючого (псевдомаксимального) потоку. В мережах з одиничними пропускними здатностями існує сильніша оцінка часової складності: O(EV).

Опис

Нехай G=((V,E),c,s,t) — транспортна мережа, в якій c(u,v) і f(u,v) — відповідно пропускна здатність і потік через ребро (u,v).

Залишкова пропускна здатність — відображення cf:V×VR+ як: якщо (u,v)E, то:

  • cf(u,v)=c(u,v)f(u,v),
  • cf(v,u)=f(u,v),

інакше cf(u,v)=0.

Залишкова мережа — граф Gf=((V,Ef),cf|Ef,s,t), де Ef={(u,v)V×Vcf(u,v)>0}.

Доповнювальний шлях st — шлях у залишковому графі Gf.

Нехай dist(v) — довжина найкоротшого шляху з s у v у графі Gf. Тоді допоміжною мережею графа Gf є граф GL=(V,EL,cf|EL,s,t), де

EL={(u,v)Efdist(v)=dist(u)+1}.

Блокувальний потік st — потік f такий, що граф G=(V,EL,s,t), де EL={(u,v)f(u,v)<cf|EL(u,v)} не містить шляху st.

Алгоритм

  • Вхід: мережа G=((V,E),c,s,t).
  • Вихід: потік st максимальної величини f.
  1. Встановити f(e)=0 для кожного eE.
  2. Створити GL з Gf графа G. Якщо dist(t)=, то зупинитися і вивести f.
  3. Знайти блокувальний потік f у GL.
  4. Доповнити потік f потоком f і перейти до другого кроку.

Аналіз

Можна показати, що щоразу кількість ребер у блокувальному потоці збільшується принаймні на одне, тому в алгоритмі не більше n1 блокувальних потоків, де n — кількість вершин у мережі. Допоміжна мережа GL може бути побудована обходом у ширину за час O(E), а блокувальний потік на кожному рівні графа може бути знайдений за час O(VE). Тому час роботи алгоритму Дініца дорівнює O(V)*(O(E)+O(VE))=O(V2E).

Використовуючи такі структури даних, як Шаблон:Нп, можна знаходити блокувальний потік на кожній фазі за час O(ElogV), тоді час роботи алгоритму Дініца може бути покращено до O(VElogV).

Приклад

Нижче наведено симуляцію алгоритму Дініца. У допоміжній мережі GL вершини з червоними мітками — значення dist(v). Блокувальний потік позначено синім.

Крок G Gf GL
1 Блокувальний потік складається зі шляхів:
  1. {s,1,3,t} з чотирма одиницями потоку,
  2. {s,1,4,t} з шістьома одиницями потоку,
  3. {s,2,4,t} з чотирма одиницями потоку.

Отже, блокувальний потік містить 14 одиниць потоку, а величина потоку |f| дорівнює 14. Варто зауважити, що доповнювальний шлях має три ребра.

2 Блокувальний потік складається з одного шляху {s,2,4,3,t} з п'ятьма одиницями потоку. Отже, блокувальний потік містить п'ять одиниць, а величина потоку |f| дорівнює 14+5=19. Варто зауважити, що доповнювальний шлях має чотири ребра.
3 Сток t недосяжний у мережі Gf. Тому алгоритм зупиняється і повертає максимальний потік величини 19. Варто зауважити, що в кожному блокувальному потоці кількість ребер у доповнювальному шляху збільшується хоча б на одне.

Література

Посилання

Шаблон:Алгоритми на графах Шаблон:Алгоритми оптимізації Шаблон:Вичитати