Курсовая работа: Алгоритм Дейкстры
Если все вершины отмечены как постоянные, то эти пометки дают длины кратчайших путей. Останов.
Если некоторые пометки являются временными, перейти к шагу 2.
Доказательство того, что вышеприведенный алгоритм действительно дает кратчайшие пути, чрезвычайно простое, дадим набросок этого доказательства.
Допустим, что на некотором этапе постоянные пометки дают длины кратчайших путей. Пусть S1 – множество вершин с этими пометками, а S2 – множество вершин с временными пометками. В конце шага 2 каждой итерации временная пометка l(xi ) дает кратчайший путь от sк xi , проходящий полностью по вершинам множества S1 . (Так как при каждой итерации во множество S1 включается только одна вершина, то обновление пометки l(xi ) требует только одного сравнения на шаге 2.)
Пусть кратчайший путь от s к xi * не проходит целиком по S1 и содержит по крайней мере одну вершину из S2 , и пусть xj S2 – первая такая вершина в этом пути. Так как по предположению cij неотрицательны, то часть пути от xj к xi * должна иметь неотрицательный вес и. Это, однако, противоречит утверждению, что l(xi *) – наименьшая временная пометка, и, следовательно, кратчайший путь к xi * проходит полностью по вершинам множества S1 , и поэтому l(xi *) является его длиной.
Так как вначале множество S1 равно (s) при каждой итерации к S1 добавляется xi *, то предположение, что l(xi *) равно длине кратчайшего путиxi S1 , выполняется при каждой итерации. Отсюда по индукции следует, что алгоритм дает оптимальный ответ.
Если требуется найти кратчайшие пути между s и всеми другими вершинами полного связного графа с n вершинами, то в процессе работы алгоритма выполняются операций сложения и сравнения на шаге 2 и еще операций сравнения на шаге 3. Кроме того, при осуществлении шагов 2 и 3 необходимо определить, какие вершины временные, а для этого нужно еще операций сравнения. Эти величины являются верхними границами для числа операций, необходимых при отыскании кратчайшего пути между заданными вершинами s и t. Они действительно достигаются, если окажется, что вершина t будет последней вершиной, получившей постоянную пометку.
Как только длины кратчайших путей от s будут найдены (они будут заключительными значениями пометок вершин), сами пути можно получить при помощи рекурсивной процедуры с использованием соотношения (*). Так как вершина xi ' непосредственно предшествует вершине xi в кратчайшем пути от s к xi , то для любой вершины xi соответствующую вершину xi ' можно найти как одну из оставшихся вершин, для которой
''. (*)
Если кратчайший путь от s до любой вершины xi является единственным, то дуги (xi ', xi ) этого кратчайшего пути образуют ориентированное дерево с корнем s. Если существует несколько «кратчайших» путей от s к какой-либо другой вершине, то при некоторой фиксированной вершине xi ' соотношение (*) будет выполняться для более чем одной вершины xi . В этом случае выбор может быть либо произвольным (если нужен какой-то один кратчайший путь между s и xi ), либо таким, что рассматриваются все дуги (xi ', xi ), входящие в какой-либо из кратчайших путей и при этом совокупность всех таких дуг образует не ориентированное дерево, а общий граф, называемый базой относительно s или кратко – s-базой .
2.2 Задачи с методическим описанием
Найти кратчайшие пути от вершины 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 имеют временные пометки.
;