Обидва вони можуть бути реалізовані з використанням точно такого ж загального алгоритму, як описано нижче:
Inputs:
G: Graph
s: Starting vertex (any for Prim, source for Dijkstra)
f: a function that takes vertices u and v, returns a number
Generic(G, s, f)
Q = Enqueue all V with key = infinity, parent = null
s.key = 0
While Q is not empty
u = dequeue Q
For each v in adj(u)
if v is in Q and v.key > f(u,v)
v.key = f(u,v)
v.parent = u
Для Prim, пас f = w(u, v)
і для Dijkstra пасf = u.key + w(u, v)
.
Інша цікава річ, що вище Generic може також реалізувати Breadth First Search (BFS), хоча це було б надмірним, оскільки дорога черга пріоритетів насправді не потрібна. Щоб перетворити вище загального алгоритму на BFS, передайте f = u.key + 1
той самий, що примусити всі ваги до 1 (тобто BFS дає мінімальну кількість ребер, необхідних для проходження від точки A до B).
Інтуїція
Ось один хороший спосіб подумати про вищезазначений загальний алгоритм: ми починаємо з двох сегментів A і B. Спочатку покладіть всі ваші вершини в B, щоб сегмент A був порожнім. Потім ми переміщаємо одну вершину з В в А. Тепер подивимось на всі ребра з вершин А, що переходять до вершин Б. Ми вибрали одне ребро, використовуючи деякі критерії з цих перехресних ребер, і перемістимо відповідну вершину з В в A. Повторюйте цей процес, поки B не порожній.
Грубим способом реалізації цієї ідеї було б підтримання черги пріоритетів ребер для вершин А, яка переходить до Б. Очевидно, це було б складно, якби графік не був розрідженим. Тож питання буде, чи можемо ми замість цього підтримувати пріоритетну чергу вершин? Це насправді ми можемо зробити, оскільки врешті-решт ми вирішили, яку вершину вибрати з B.
Історичний контекст
Цікаво, що загальна версія техніки, що лежить в основі обох алгоритмів, концептуально стара як 1930, навіть коли електронних комп’ютерів не було поруч.
Історія починається з Отакара Борівки, якому потрібен був алгоритм для сімейного друга, який намагався з’ясувати, як з’єднати міста в країні Моравія (нині частина Чеської Республіки) мінімальними електричними лініями. Він опублікував свій алгоритм у 1926 році у журналі, пов’язаному з математикою, оскільки тоді комп’ютерних наук не існувало. Це звернуло увагу на Войтеха Ярника, який задумав вдосконалити алгоритм Борівки та опублікував його в 1930 році. Він фактично відкрив той самий алгоритм, який ми зараз знаємо як алгоритм Прима, який знову його відкрив у 1957 році.
Незалежно від усього цього, в 1956 році Дейкстрі потрібно було написати програму, щоб продемонструвати можливості нового комп'ютера, розробленого його інститутом. Він вважав, що було б круто мати комп’ютер, щоб знайти зв’язок для подорожі між двома містами Нідерландів. Він розробив алгоритм за 20 хвилин. Він створив графік 64 міст з деякими спрощеннями (оскільки його комп’ютер був 6-розрядним) і написав код для цього комп’ютера 1956 року. Однак він не опублікував свій алгоритм, оскільки в першу чергу не було журналів з інформатики, і він вважав, що це може бути не дуже важливим. Наступного року він дізнався про проблему підключення клем нових комп'ютерів таким чином, щоб довжина проводів була мінімізована. Він задумався над цією проблемою і знову відкрив Ярніка / Прима алгоритм, який знову використовує ту саму техніку, що і алгоритм найкоротшого шляху, який він відкрив роком раніше. Вінзгадав, що обидва його алгоритми були розроблені без використання ручки чи паперу. У 1959 році він опублікував обидва алгоритми у статті, яка займає лише 2 з половиною сторінки.