проміжку [2; 200]): raquo ;;
while (n lt; 2 || n gt; 200)
{= Check (n);
if (n lt; 2) lt; lt; endl lt; lt; tНеправільно задано кількість вершин! Введене число менше 2! Raquo;
lt; lt; n t t t tПопробуйте ще раз! 2 n n raquo ;; (n gt; 200) lt; lt; endl lt; lt; tНеправільно задано кількість вершин! Введене число більше 200! Raquo;
lt; lt; n t t t tПопробуйте ще раз! 2 n n raquo ;;
} lt; int gt; vertex (n);=Valency (vertex); lt; vector lt; int gt; gt; graph (n); indexMax=FindMax (vertex, 1);=0; ( vertex (indexMax) gt; 0)
{ lt; int gt; temp=vertex; [indexMax]=0; (int i=0; i lt; graph (indexMax) .size (); i ++) {(int j= 0; j lt; temp.size (); j ++)
{(j == graph [indexMax] [i] || j == -graph [indexMax] [i])
{[j]=0 ;;
}
}
} tS=0;
for (int i=0; i lt; temp.size (); i ++)//перевірка, не порожній Чи темп
{(temp [i] == 0) ++;
} (tS == temp.size ())//якщо порожній то робимо кратні зв'язки
{= vertex; [indexMax]=0;
} indexDn=FindMax (temp, 0); (indexMax gt; indexDn) (indexMax, indexDn);(indexMax).push_back(indexDn);graph(indexDn).push_back(-indexMax);(indexMax)--;(indexDn)--;= FindMax (vertex, 1);} lt; vector lt; int gt; gt; graphMatr (n, vector lt; int gt; (n));
for (int i=0; i lt; graph.size (); i ++)//легко переробити в матрицю суміжності
{(int j=0; j lt; graph (i) .size (); j ++)
{l=rand ()% 2; (graph [i] [j] gt; 0) [i] [graph [i] [j]]=1;
} h=0; (int e=0; e lt; i; e ++) (graphMatr [e] [i])
{= 1 ;;
}
(i gt; 0 amp; amp;! h)
{= rand ()% i; [h] [i]=rand ()% 19 - 8;
}
} graphMatr;
}
Алгоритм пошуку потоку мінімальної вартості
Для знаходження мінімальної вартості заданого потоку слід скористатися наступним алгоритмом:
Знаходимо максимально можливий потік по теоремі Фалкерсона, за вихідний потік беремо 2/3 максимального потоку;
Знаходимо мінімальний шлях з витоку в сток мережі в матриці вартостей за допомогою алгоритму Беллмана-Форда, залежно від чисел в матриці ваг;
Пропускаємо по знайденому шляху максимальний можливий потік для цього шляху;
З ребер матриці пропускних спроможностей віднімаємо величину потоку, тобто встановлюємо залишкову пропускну спроможність цих ребер;
Для кожного обнуленням ребра в матриці пропускних спроможностей обнуляем ребро в матриці вартостей;
Якщо поточний пропущений потік менше заданого переходимо до кроку 1.
Реалізація алгоритму:
void pot_min_st (vector lt; vector lt; int gt; gt; propSpos, vector lt; vector lt; int gt; gt; price, vector lt; int gt; s, vector lt; int gt; t, int max)
{n=propSpos.size (), maxB=max ;; minPath, ti, tj, temp; temps, tempt; lt; vector lt; int gt; gt; rezult (n, vector lt; int gt; (n)); lt; vector lt; int gt; gt; priceEtalon (price); lt; int gt; minP; (max)
{= Deykstra (price, s [0], t [0]);=0;=0; (int i=0; i lt; s.size (); i ++) (int j=0; j lt; t.size (); j ++) (min (minPath, Deykstra (price, s [i], t [j]))!=minPath)
{= Deykstra (price, s [i], t [j]);=i;=j;
}=MakePath (price, 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];
} (temp gt; max) temp=max;
cout lt; lt; endl lt; lt; Пускаємо потік ( lt; lt; temp lt; lt; ) lt; lt; по шляху raquo ;;
ti=0; lt; int gt; :: iterator it; (it=minP.begin (); it!=minP.end (); it ++, ti ++)
{ lt; lt; * it + 1; (ti lt; minP.size () - 1)
cout lt; lt; - raquo ;;
}=0; lt; lt; laquo ;. Вартість даного потоку raquo ;;
for (list lt; int gt; :: iterator it=minP.begin (), jt=minP.begin (); it!=--minP.end (); ...