Во многих задачах маршрутизации поиск кратчайшего или наименее взвешенного пути от одной вершины к другой в графе является очень важным уточнением. Формально выражается как, учитывая взвешенный ориентированный граф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[]