Во многих задачах маршрутизации поиск кратчайшего или наименее взвешенного пути от одной вершины к другой в графе является очень важным уточнением. Формально выражается как, учитывая взвешенный ориентированный графG = (V, E), вершинаsприбытьvсередина вершиныtКратчайший путь для множества реберEсреднее соединениеsприбытьtПуть с наименьшими затратами. Для этого сначала решите более общую задачу кратчайшего пути с одним источником. В задаче о кратчайшем пути с одним источником вычисления начинаются с начальной вершиныsКратчайшее расстояние до других соседних вершин.
Алгоритм Дейкстры
Один из способов решения задачи поиска кратчайшего пути с одним источником:Dijkstraалгоритм.DijkstraАлгоритм сгенерирует дерево кратчайших путей, корнем дерева будет начальная вершинаs, ветви дерева исходят из вершинsвычислятьGКратчайший путь ко всем остальным вершинам в . Этот алгоритм требует, чтобы все значения в графе были неотрицательными. иPrimАлгоритм аналогичен,DijkstraАлгоритм также использует жадный алгоритм, который всегда добавляет кратчайшее ребро, которое в данный момент выглядит ближайшим к кратчайшему пути.
В корне,DijkstraАлгоритм выбирает вершину и непрерывно обнаруживает связанные с ней ребра, подобно поиску в ширину, чтобы найти текущую ближайшую точку.
Алгоритм потока:
- искать из вершины
aНачальный кратчайший путь из одного источника — это расстояние между каждой точкой на графикеaкратчайший путь.
- выбран
a, метка была посещена, сначала инициализируйте каждую точку на графике с помощьюaРасстояние в реальном коде обычно использует массивdist[i]Сохраните это значение. Если оно временно недоступно, сохраните в нем максимальное значение. Как показано, толькоb,cнепосредственно сaподключить, на этот разdist[b]=8,dist[c]=4. другая точкаdist[i]=NaN,Последующая операция заключается в постоянном обновлении этогоdistмножество.
- выбрать снова
distМинимальное расширение элемента, очевидноc,отметкаvisit, на этот раз черезcточка,f,eтакже генерирует новый сaрасстояние, обновить на этот разdistмассивы, их предыдущие расстояния от a равныNaN, конечно если оригиналaрасстояние больше, чем черезcиaНеобходимо обновить расстояния.
- узнать
visitсерединаdistнаименьшая точка, найденнаяf,так какb, d, eоба сfРядом, на этот раз сравнение проходитfпосле сaрасстояние, если оно больше исходногоdistкороче, обновлениеdist.
- выберите вершину
b.
- при выборе вершин
d, eобразуют кратчайший путь.
DijkstraРеализация алгоритма:
1 function Dijkstra(Graph, source):
2
3 create vertex set Q
4
5 for each vertex v in Graph: // Initialization
6 dist[v] ← INFINITY // Unknown distance from source to v
7 prev[v] ← UNDEFINED // Previous node in optimal path from source
8 add v to Q // All nodes initially in Q (unvisited nodes)
9
10 dist[source] ← 0 // Distance from source to source
11
12 while Q is not empty:
13 u ← vertex in Q with min dist[u] // Source node will be selected first
14 remove u from Q
15
16 for each neighbor v of u: // where v is still in Q.
17 alt ← dist[u] + length(u, v)
18 if alt < dist[v]: // A shorter path to v has been found
19 dist[v] ← alt
20 prev[v] ← u
21
22 return dist[], prev[]