it ++, jt=it)
{++; +=price [* it] [* jt] * temp; [* it] [* jt] -=temp; [* it] [* jt] +=temp; (! propSpos [* jt] [* it] amp; amp; propSpos [* it] [* jt])
{[* jt] [* it] +=temp; [* jt] [* it]=-price [* it] [* jt];
} (! propSpos [* it] [* jt] amp; amp;! rezult [* jt] [* it]) [* it] [* jt]=0;
} lt; lt; ti lt; lt; endl; (max - temp) lt; lt; Залишившись потік дорівнює lt; lt; max - temp lt; lt; endl;
Save (price, Проміжна матриця вартості ); (propSpos, Проміжна матриця пропускної здатності );
for (int i=0; i lt; n; i ++) (int j=i; j lt; n; j ++) (price [i] [j] lt; 0) [i] [j]=0; -=temp;
} rez=0; (int i=0; i lt; n; i ++) (int j=i; j lt; n; j ++) (rezult [i] [j]) += rezult [i] [j] * priceEtalon [i] [j];
cout lt; lt; endl lt; lt; Мінімальна вартість потоку lt; lt; maxB lt; lt; дорівнює lt; lt; rez; lt; lt; endl lt; lt; Все проміжні матриці вартості і потоків збережені у файл graph.txt raquo ;; (rezult.size () lt; 25) (rezult, n t tНовая матриця потоків ); lt; lt; endl lt; lt; Нова матриця потоків збережена у файл graph.txt n lt; lt; endl;
}
Алгоритм Фалкерсона
Алгоритм Форда - Фалкерсона вирішує задачу знаходження максимального потоку в транспортній мережі.
Ідея алгоритму полягає в наступному. Спочатку величині потоку присвоюється значення 0: f (u, v)=0 для всіх u, v? V. Потім величина потоку итеративно збільшується за допомогою пошуку збільшує шляху (шлях від джерела s до стоку t, уздовж якого можна послати більший потік). Процес повторюється, поки можна знайти збільшує шлях.
Обнуляємо всі потоки. Залишкова мережу спочатку збігається з вихідною мережею.
У залишкової мережі знаходимо будь-який шлях з джерела в стік. Якщо такого шляху немає, зупиняємося.
Пускаємо через знайдений шлях (він називається збільшує шляхом) максимально можливий потік:
На знайденому шляху в залишковій мережі шукаємо ребро з мінімальною пропускною здатністю.
Для кожного ребра на знайденому шляху збільшуємо потік на, а в протилежному йому - зменшуємо на.
Модифікуємо залишкову мережу. Для всіх ребер на знайденому шляху, а також для протилежних їм ребер, обчислюємо нову пропускну здатність. Якщо вона стала ненульовий, додаємо ребро до залишкової мережі, а якщо обнулилася, стираємо його.
Повертаємося на крок 2.
Важливо, що алгоритм не конкретизує, який саме шлях ми шукаємо на кроці 2 або як ми це робимо. З цієї причини алгоритм гарантовано сходиться тільки для цілих пропускних спроможностей, але навіть для них при великих значеннях пропускних спроможностей він може працювати дуже довго.
Реалізація алгоритму
# include main.h
int min (int a, int b) {(a == 0) return b; (b == 0) return a; (a lt; b)? a: b;} Svyazn (vector lt; vector lt; int gt; gt; amp; matr) { lt; vector lt; int gt; gt; temp (matr); n=matr.size (); (int i=0; i lt; n; i ++) (int j=0; j lt; n; j ++) (int k=0; k lt; n; k ++) (i!=k amp; amp; i!=j amp; amp; temp [j] [i]!=0 amp; amp; temp [i] [k]!=0 amp; amp; (min ( temp [j] [k], (temp [j] [i] + temp [i] [k]))!=temp [j] [k])) [j] [k]=temp [j] [i ] + temp [i] [k]; (int i=1; i lt; n; i ++) (! temp [0] [i]) return false; true;} Falkerson (vector lt; vector lt; int gt; gt; propSpos , vector lt; int gt; s, vector lt; int gt; t) {n=propSpos.size (), max=0, ti=0, tj=0, minPath, temp; lt; vector lt; int gt; gt; rezult (n, vector lt; int gt; (n)); lt; int gt; minP; {= Bellman (propSpos, s [0], t [0]); //=0;=0; (int i=0; i lt; s.size (); i ++) (int j=0; j lt; t.size (); j ++) (min (minPath, Bellman (propSpos, s [i], t [j]))!=minPath)//
{= Bellman (propSpos, s [i], t [j]); //=i;=j;
}=MakePath (propSpos, minPath, s [ti], t [tj]); //=propSpos [* minP.begin ()] [* ++ minP.begin ()]; (list lt; int gt; :: iterator it=minP.begin (), jt=minP.begin (); it!=--minP.end (); it ++, jt=it)
{++; (min (propSpos [* it] [* jt], temp)!=temp)=propSpos [* it] [* jt];
}=0; (list lt; int gt; :: iterator it=minP.begin (), jt=minP.begin (); it!=--minP.end (); it ++, jt =it)
{++; +=propSpos [* it] [* jt] * temp;//[* it] [* jt] -=temp; [* it] [* jt] += temp; (! propSpos [* jt] [* it] amp; amp; propSpos [* it] [* jt]) [* jt] [* it] +=temp; (! propSpos [* it] [* jt] amp; amp;! rezult [* jt...