] [* it]) [* it] [* jt]=0;
} +=temp;
} while (Svyazn (propSpos));//max;
}
Алгоритм Беллмана - Форда
Алгоритм Беллмана-Форда - алгоритм пошуку найкоротшого шляху в зваженому графі. Він має складність О (p * q) - це найгірший випадок і складність О (р) в кращому випадку. Алгоритм знаходить найкоротші шляхи від однієї вершини графа до всіх інших. На відміну від алгоритму Дейкстри, алгоритм Беллмана-Форда допускає ребра з негативним вагою, але його обмеженням є те, що на вході повинен бути граф без циклів з негативним вагою. У нашому випадку на вхід функції йде порядковий номер вершин, між якими буде відбуватися пошук найкоротшого шляху.
На відміну від алгоритму Дейкстри в цьому алгоритмі немає постійних міток, але є черга. Спочатку береться стартова вершина і заноситься в чергу. Відстань до інших вершин передбачається рівним нескінченності (тобто константа LONG_MAX в нашій програмі).
Крок алгоритму. Видаляємо вершину з початку черги. Для кожної сусідньої вершини коригуємо мітку за формулою з кроку алгоритму Дейкстри. Якщо при цьому нове значення менше старого, то коректуємо чергу, інакше продовжуємо перебір вершин і коригування тимчасових міток.
Коригування черги. Якщо раніше вершина не була в черзі, то її ставимо в кінець, а якщо була або знаходиться в даний момент, то ставимо її в початок черги.
Алгоритм працює, поки черга не стане порожньою, тобто поки з черги можна взяти вершину.
Реалізація алгоритму:
int Bellman (vector lt; vector lt; int gt; gt; amp; matr, int start, int end)
{n=matr.size (); t; lt; vector lt; int gt; gt; temp (n, vector lt; int gt; (2)); (int i=0; i lt; n; i ++) [i] [0]=LONG_MAX; lt; int gt; queue; .push_back (start); [start] [1]=1; [start] [0]=0; (queue.size ()!=0)
{= * queue.begin () ;. erase (queue.begin ()); (int i=0; i lt; matr.size (); i ++)
{// для кожної вершини (matr [t] [i]!=0)
{[i] [0]; [t] [0] + matr [t] [i]; (min (temp [i] [0], min (temp [i] [0 ], temp [t] [0] + matr [t] [i]))!=temp [i] [0])
{[i] [0]=temp [t] [0] + matr [t] [i]; (temp [i] [1]). insert (queue.begin (), i);
{. push_back (i);//Інакше - в кінець [i] [1]=1;
}}}}} temp [end] [0];}
Алгоритм Дейкстри
Алгоритм Дейкстри знаходить найкоротша відстань від однієї з вершин графа до всіх інших. Алгоритм працює тільки для графів без ребер негативного ваги (через це перед початком роботи алгоритму, всі негативні ваги в матриці беруться по модулю). Складність - O (n).
Роботу алгоритму можна розділити на два етапи:
Перший етап: Присвоєння вершин початкових міток.
Кожній вершині зіставимо мітку - відстань від цієї вершини до початкової вершини. Алгоритм працює покроково - на кожному кроці він «відвідує» одну вершину і намагається зменшувати мітки. Робота алгоритму завершується, коли всі вершини відвідані.
Мітка початкової вершини покладається рівною 0, мітки інших вершин - нескінченності (роль нескінченності виконує константа LONG_MAX, рівна 2147483647L). Нескінченність означає, що відстані від початкової вершини до інших поки невідомі. Всі вершини графа, крім початкової, позначаються що не відвідані.
Крок алгоритму.
Якщо всі вершини відвідані, алгоритм завершується. В іншому випадку, з ще не відвіданих вершин вибирається вершина u, що має мінімальну мітку. Ми розглядаємо всілякі маршрути, в яких u є передостаннім пунктом. Для кожної сусідньої вершини u, крім відвіданих, розглянемо нову довжину шляху, що дорівнює сумі значень поточної мітки u і довжини ребра, що з'єднує u з сусідньою вершиною. Якщо отримане значення довжини менше значення мітки сусідній вершини, замінимо значення мітки отриманим значенням довжини. Розглянувши всі сусідні вершини, пометим вершину u як відвідану і повторимо крок алгоритму.
У нашому випадку потрібно знайти найкоротша відстань між заданими вершинами, тому на вході дві вершини, а не одна. Другий етап: Побудова найкоротшого шляху.
Серед вершин, які безпосередньо передують поточної, з постійною міткою, шукаємо вершину, що задовольняє співвідношенню:
де мітка вершини, вага ребра, поточна вершина, яка додається в маршрут.
Реалізація алгоритму:
Перший етап
int Deykstra (vector lt; vector lt; int gt; gt; ...