

64 Пути в бесконтурном графе. Общая теория:
У нас есть граф G=(V,E), где связь между вершинами v и w следующая: a(v,w) E. Если связь между вершинами отсутствует, то a(v,w)=
.
Если последняя вершина wo, w1, …, wn определяет путь в графе, то его длина равна суммарному весу входящих вершин:
Наша задача – нахождение кратчайшего пути между вершинами S, t. M(S,t) – расстояние между S и t. Путь из S в t, который имеет минимальную длину – есть кратчайший путь, между вершинами S и t. d(S,t)=d(S,vk) + a(vk,t)
d(S,vk)=d(S,vk-1)+a(vk-1,vk)
vk-1 |
vk |
t
S
Поиск кратчайшего пути в бесконтурном графе:
Поиск кратчайшего пути в бесконтурном графе имеет 2 части. Первая переименование вершин графа так, что первая вершина не имеет входящих вершин. Вторая часть сам поиск кратчайших путей.
Для начала зададим произвольный бесконтурный граф с произвольной нумерацией и весами.
И запишем его в виде матрице смежности, где ребра которые не входят в другие ребра будем отмечать максимально большим числом 32767.
Для перенумерации графа, так чтобы вершина №1 имела только исходящие ребра, используем алгоритм Topolsoft.
Алгоритм Topolsoft (G,N)
1)for each v ϵ V do p[v] 0
2)for each w ϵ V do
3)for each v ϵ V
4)p[v] p[v]+1
5)end for
6)end for
7)Стек
8)for each v ϵ V do
9)if p[v] = 0 then
10)Стек v
11)end if
12)end for
13)num 0
14)while Стек ≠ do
15)w Стек
16)num num+1
17)N[w] num
18)for each v ϵ V
19)p[v] p[v]-1
20) |
if p[v] = 0 then Стек v |
21) |
end if |

22)end for
23)end while
24)end for
После чего получим следующую нумерацию графа.
Алгоритм поиска наикратчайших путей.
После можно найти кратчайшие расстояния от вершины №1 до каждой из вершин по алгоритму DSP.
Алгоритм DSP(G, N, d)
1)for j = 1 to n do d[vj]
2)d[v1] 0
3)for j = 2 to n do
4)for I = 1 to j-1 do
5)if d[vj] d[vi]+a[vi, vj] then
6)d[vj] d[vi]+a[vi, vj]
7)end if
8)end for
9)end for
10)end for
После выводим на экран результат. При этом вычислительная сложность считаем следующим образом:
И она составит: