Как только длины кратчайших путей от s будут найдены (они будут заключительными значениями пометок вершин), сами пути можно получить при помощи рекурсивной процедуры с использованием соотношения (*). Так как вершина xi' непосредственно предшествует вершине xi в кратчайшем пути от s к xi, то для любой вершины xi соответствующую вершину xi' можно найти как одну из оставшихся вершин, для которой
' ' . (*)Если кратчайший путь от s до любой вершины xi является единственным, то дуги (xi', xi) этого кратчайшего пути образуют ориентированное дерево с корнем s. Если существует несколько «кратчайших» путей от s к какой-либо другой вершине, то при некоторой фиксированной вершине xi' соотношение (*) будет выполняться для более чем одной вершины xi. В этом случае выбор может быть либо произвольным (если нужен какой-то один кратчайший путь между s и xi), либо таким, что рассматриваются все дуги (xi', xi), входящие в какой-либо из кратчайших путей и при этом совокупность всех таких дуг образует не ориентированное дерево, а общий граф, называемый базой относительноs или кратко – s-базой.
Найти кратчайшие пути от вершины 1 ко всем другим вершинам графа
Неориентированное ребро будем рассматривать как пару противоположно ориентированных дуг равного веса. Воспользуемся алгоритмом Дейкстры. Постоянные пометки будем снабжать знаком +, остальные пометки рассматриваются как временные.
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 |
x1 | 10 | 3 | 6 | 12 | ||||
x2 | 10 | 18 | 2 | 13 | ||||
x3 | 18 | 25 | 20 | 7 | ||||
x4 | 25 | 5 | 16 | 4 | ||||
x5 | 5 | 10 | ||||||
x6 | 20 | 10 | 14 | 15 | 9 | |||
x7 | 2 | 4 | 14 | 24 | ||||
x8 | 6 | 23 | 15 | 5 | ||||
x9 | 12 | 13 | 9 | 24 | 5 |
Алгоритм работает так:
Шаг 1.
.Первая итерация
Шаг 2.
- все пометки временные. ; ; ;Шаг 3.
соответствует x7.Шаг 4. x7 получает постоянную пометку l(x7)=3+, p=x7.
Шаг 5. Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Вторая итерация
Шаг 2.
- все пометки временные. ; ; ;Шаг 3.
соответствует x2.Шаг 4. x2 получает постоянную пометку l(x2)=5+, p=x2.
Шаг 5. Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Третья итерация
Шаг 2.
- только вершины x3 и x9 имеют временные пометки. ;Шаг 3.
соответствует x8.Шаг 4. x8 получает постоянную пометку l(x8)=6+, p=x8.
Шаг 5. Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Четвертая итерация
Шаг 2.
- только вершины x5, x6 и x9 имеют временные пометки. ; ;Шаг 3.
соответствует x4.Шаг 4. x4 получает постоянную пометку l(x4)=7+, p=x4.
Шаг 5. Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Пятая итерация
Шаг 2.
- только вершины x5, x6 и x3 имеют временные пометки. ; ;Шаг 3.
соответствует x9.Шаг 4. x9 получает постоянную пометку l(x9)=11+, p=x9.
Шаг 5. Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Шестая итерация
Шаг 2.
- только вершина x6 имеет временную пометку.Шаг 3.
соответствует x5.Шаг 4. x5 получает постоянную пометку l(x5)=12+, p=x5.
Шаг 5. Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Седьмая итерация
Шаг 2.
- только вершина x6 имеет временную пометку.Шаг 3.
соответствует x6.Шаг 4. x6 получает постоянную пометку l(x5)=17+, p=x6.
Шаг 5. Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Восьмая итерация
Шаг 2.
- только вершина x3 имеет временную пометку.Шаг 3. x3 получает постоянную пометку l(x3)=23+.
Найти кратчайшие пути от вершины 1 ко всем другим вершинам графа
Неориентированное ребро будем рассматривать как пару противоположно ориентированных дуг равного веса. Воспользуемся алгоритмом Дейкстры. Постоянные пометки будем снабжать знаком +, остальные пометки рассматриваются как временные.
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 |
x1 | 3 | 2 | ||||||
x2 | 5 | 15 | 12 | |||||
x3 | 8 | 24 | ||||||
x4 | 6 | 8 | 18 | 4 | 11 | |||
x5 | 12 | 7 | 20 | |||||
x6 | 20 | 9 | 13 | |||||
x7 | 10 | 4 | 9 | 16 | ||||
x8 | 24 | 16 | 22 | |||||
x9 | 11 | 13 |
Алгоритм работает так:
Шаг 1.
.Первая итерация
Шаг 2.
- все пометки временные. ;Шаг 3.
соответствует x5.Шаг 4. x5 получает постоянную пометку l(x5)=2+, p=x5.
Шаг 5. Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.
Вторая итерация
Шаг 2.
- все пометки временные. ; ;Шаг 3.
соответствует x2.Шаг 4. x2 получает постоянную пометку l(x2)=3+, p=x2.
Шаг 5. Не все вершины имеют постоянные пометки, поэтому переходим к шагу 2.