Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сиаод_ответы_16_79.doc
Скачиваний:
211
Добавлен:
11.05.2015
Размер:
7.84 Mб
Скачать

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 части. Первая переименование вершин графа так, что первая вершина не имеет входящих вершин. Вторая часть сам поиск кратчайших путей.

Для начала зададим произвольный бесконтурный граф с произвольной нумерацией и весами.

Рисунок 3.1. – Заданный граф.

И запишем его в виде матрице смежности, где ребра которые не входят в другие ребра будем отмечать максимально большим числом 32767.

Рисунок 3.2 – Матрица смежности.

Для перенумерации графа, так чтобы вершина №1 имела только исходящие ребра, используем алгоритм Topolsoft.

Алгоритм Topolsoft (G,N)

  1. for each v ϵ V do p[v] 0

  1. for each w ϵ V do

  2. for each v ϵ V

  3. p[v] p[v]+1

  4. end for

  5. end for

  6. Стек

  1. for each v ϵ V do

  2. if p[v] = 0 then

  3. Стек v

  4. end if

  5. end for

  6. num 0

  7. while Стек do

  8. w Стек

  9. num num+1

  10. N[w] num

  11. for each v ϵ V

  12. p[v] p[v]-1

  13. if p[v] = 0 then Стек v

  14. end if

  15. end for

  16. end while

  17. end for

После чего получим следующую нумерацию графа.

Рисунок 3.3. – Переименованный граф.

Алгоритм поиска наикратчайших путей.

После можно найти кратчайшие расстояния от вершины №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

После выводим на экран результат. При этом вычислительная сложность считаем следующим образом:

И она составит:

65 Алгоритм Флойда поиска кратчайших путей между всеми парами вершин

Общая теория:

У нас есть граф 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)

1 2

(6) (7)

(3)

3 (1) 4

Матрица весов графа:

0 3

А= 2 0

7 0 1

6 0

Матрица расстояний графа:

0 10 3 4

D= 2 0 5 6

7 7 0 1

6 16 9 0

D(0) =A, D(1), D(k), D(k-1), …, D(n)=D

Каждая из этих матриц содержит кратчайшие пути с учетом ограничений.

dij(k) – количество промежуточных вершин не > k

dij(k)=min{ dij(k-1), dik(k-1) + dkj(k-1)}

Алгоритм Floyd (A[1…n,1…n])

  1. D0A;

  2. for k=1 to n do;

  3. for i=1 to n do;

  4. for j=1 to n do;

  5. if dik(k-1) + dkj(k-1)< dij(k-1)then;

  6. dij(k) dik(k-1) + dkj(k-1);

  7. else dij(k) dij(k-1);

  8. end for;

  9. end for;

  10. end for;

  11. return T(n).

0 3

D(0)=А= 2 0

7 0 1

6 0

0 3 рассматриваем вершину 1 как промежуточную

D(1)= 2 0

7 0 1

6 0

0 3 рассматриваем вершину 1 и 2 как промежуточную

D(2)= 2 0

7 0 1

6 0

0 3 рассматриваем вершину 1и 2 и 3 как промежуточную

D(3)= 2 0

7 0 1

6 0

0 3

D(4)= 2 0

7 0 1

6 0

Вычислительная сложность:

O(n3).