Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 4. Взвешенные графы и орграфы, 2 часть.doc
Скачиваний:
12
Добавлен:
13.02.2016
Размер:
553 Кб
Скачать
☆

(

Определение

Bellman-Ford)

Алгоритм Беллмана-Форда позволяет решать задачу одного источника для взвешенного (графа) орграфа. Алгоритм работает при отрицательных весах дуг и, кроме того, определяет цикл отрицательного веса.

Атрибуты

В орграфе D=(V,A) задана вершина-источник s. Для каждой вершины v V устанавливаются следующие аттрибуты:

  • d[v] – верхняя граница веса кратчайшего пути между s и v;

  • π[u] – вершина-предшественник (вершина u является последней вершиной, из которой путь пришел в вершину v).

Релаксация

Процесс релаксации аналогичен процессу, применяемому в алгоритме Дейкстры.

Очередь

Алгоритм устанавливает очередь FIFO дуг (первым пришел – первым вышел). Вершины ставятся в очередь случайным образом, поэтому не требуются сведения о расстояниях d[u].

Итерации

Алгоритм Беллмана-Форда выполняется в общем случае за |V|-1 итераций.

Инициализация:

d[s]=0, d[v]= π[v]=nil для всех v V-s.

При i=1 до i-|V|-1

Делать для каждой дуги {u,v} из FIFO очереди

Делать

Если d[u]+w(u,v)<d[v], тогда

d[v]= d[u]+w(u,v);

π[v]=u.

Определение циклов отрицательного веса:

Для каждой дуги {u,v} A

Делать

Если d[v]>d[u]+w(u,v), то возвратить FALSE,

Иначе TRUE

Псевдокод

Сложность алгоритма Беллмана-Форда – О(mn), n=|V|, m=|A|.

FIFO очередь дуг (случайно построенная)

{d,c},{e,d},{b,e},{b,d},{d,b},{b,c},{s,c},{s,b}

FIFO очередь дуг (случайно построенная)

{b,d},{b,e},{e,d},{{d,c},d,b},{b,c},{s,c},{s,b}

3.6.3. Алгоритм Флойда (Floyd)

Определения

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

Алгоритм Флойда оперирует с матрицей весов[W(i,j)], которая является разновидностью взвешенной матрицы связности:

0 при i=j;

w(vi,vj), если есть ребро (дуга)из вершины vi в вершину vj;

в остальных случаях;

[W(i,j)]=

где w(vi,vj) – вес ребра (дуги) { vi,vj };

- знак бесконечности.

В течении k проходов справедлива следующай формула:

W(i,j)=min {W(i,j),W(i,k)+W(k,j)},

которая означает, что если путь через V(k) является кратчайшим, то он и выбирается.

Для k=1 до n делать

Для j=1 до n делать

Для i=1 до n делать

S=W(i,k)+W(k,j);

Если S<W(i,j) , тогда

Конец j цикла;

Конец k цикла.