Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Graph-Alg.doc
Скачиваний:
1
Добавлен:
16.09.2019
Размер:
175.62 Кб
Скачать

Алгоритм Дейкстри обчислення вартостей найкоротших шляхів з одного джерела у орграфі

Розглянемо таку задачу. Задано скінченний орграф G=(V,E), у якому ви-ділена деяка вершина v0, визначена функція l: VVR0, де R0 – множина усіх невід’ємних дійсних чисел, причому l(v,v)=0 vV, а значення l(v,u) за умов (v,u)E, vu не визначене (будемо позначати l(v,u) у такому випадку +). Якщо (v,u) E, то l(v,u) – позначка дуги (v,u) (можна вважати, що l(v,u) – вартість або довжина дуги (v,u)). Необхідно визначити для кожної вершини v орграфу G, відмінної від v0, найменшу суму позначок дуг, узяту по усіх шляхах між v0 та v (іншими словами, потрібно знайти вартість найкоротшого шляху між v0 та v для кожної вершини v орграфу G, відмінної від v0).

Ідея розв’язання цієї задачі полягає у тому, що будується така множина вершин S орграфу G, що найкоротший шлях з v0 у кожну вершину з множини S складається з вершин, що належать S. Якщо усі вершини орграфу G знаходяться у S, задача розв’язана, інакше слід поповнити множину S новою вершиною. Продовжувати процес поповнення S необхідно поки SV; коли S=V, поповнення S припиняється. Для зберігання вартостей поточних найкоротших шляхів з v0 у вершини G, таких що усі їх внутрішні вершини належать S, будемо використовувати масив D (розмірність масиву D дорівнює порядку орграфу G). Позначатимемо через D[v] елемент масиву D, що містить довжину найкоротшого шляху між v0 та v, усі внутрішні вершини якого знаходяться у S. Для надання значень S та D використаємо знак присвоювання «:=».

Алгоритм Дейкстри.

1. Надати S початкове значення: S:={v0}.

2. Надати D початкове значення: D[v0]:=0; для усіх вершин з V, відмінних від v0, виконати: D[v]:=l(v0,v).

3. Поки SV, виконувати:

3.1) вибрати вершину w з множини (тобто вершину, що досі не знаходилася у S), для якої D[w] приймає найменше значення;

3.2) внести w у S (тобто переобчислити S: S:=S{w});

3.3) для кожної вершини v з множини переобчислити значення D[v]: D[v]:=min(D[v], D[w]+l(w,v)).

4. Кінець.

Зауважимо, що у п.3.3 алгоритму перевіряється, чи немає такого шляху між v0 та v, що проходить через вершину w, та є більш коротким, ніж вже знайдений шлях між цими вершинами.

Даний алгоритм обчислює для орграфу G порядку n вартість найкоротшого шляху серед усіх шляхів між v0 та v для кожної вершини v орграфу G, відмінної від v0, й витрачає на це часу не більше, ніж O(n2).

Розглянемо приклад. Нехай задано орграф G=({v0,v1,v2,v3,v4},{(v0,v1), (v0,v2),(v0,v4),(v1,v2),(v2,v3),(v2,v4),(v4,v3)}), у якому виділена вершина v0, та функція l (наведемо тільки ті її значення, що відмінні від 0 та +): l(v0,v1)=4, l(v0,v2)=8, l(v0,v4)=14, l(v1,v2)=3, l(v2,v3)=9, l(v2,v4)=5, l(v4,v3)=2. Знайдемо для кожної вершини v даного орграфу вартість найкоротшого шляху між вершинами v0 та v за допомогою алгоритму Дейкстри. Спочатку S={v0}, D[v0]=0, D[v1]=4 (оскільки l(v0,v1)=4), D[v2]=8 (оскільки l(v0,v2)=8), D[v3]=+ (оскільки у орграфі G немає дуги (v0,v3), значення функції l визначається так: l(v0,v3)=+), D[v4]=14 (оскільки l(v0,v4)=14). Не усі вершини орграфу G належать S, отже, виберемо серед вершин v1, v2, v3, v4 ту, для якої значення, що зберігається у масиві D, найменше. Це вершина v1. Отже, її слід внести у множину S. Маємо нове значення S: S={v0,v1}. Тепер для кожної вершини v орграфу G, що не належить S (тобто для v2, v3, v4), обчислимо величину min(D[v], D[v1]+l(v1,v)). Маємо:

min(D[v2], D[v1]+l(v1,v2))=min(8,4+3)=min(8,7)=7;

min(D[v3], D[v1]+l(v1,v3))=min(+,4+(+))=+;

min(D[v4], D[v1]+l(v1,v4)) =min(14,4+(+))=14.

Таким чином, D[v2]=7, D[v3]=+, D[v4]=14. Бачимо, що між вершинами v0 та v2 знайдено більш короткий шлях, ніж раніше (це шлях v0, v1, v2). Оскільки SV, продовжуємо обчислення. Знову виберемо серед вершин орграфу G, що не входять у S (тобто серед вершин v2, v3, v4), ту, для якої значення, що зберіга-ється у масиві D, найменше. Це вершина v2. Вносимо її у множину S й маємо: S={v0,v1,v2}. Тепер ={v3,v4}. Для кожної вершини v з обчислимо зна-чення min(D[v], D[v2]+l(v2,v)). Маємо:

min(D[v3], D[v2]+l(v2,v3))=min(+,7+9)=min(+,16)=16;

min(D[v4], D[v2]+l(v2,v4))=min(14,7+5)=min(14,12)=12.

Отже, D[v3]=16, D[v4]=12. Перевіряємо умову SV. Вона виконується; тому вибираємо з вершин, що не входять у S, ту, для якої значення, що зберігається у масиві D, найменше. Це вершина v4. Вносимо її у S; маємо: S={v0,v1,v2,v4}. Лише одна вершина орграфу G не належить S. Це вершина v3. Виконаємо для v3 відповідні обчислення:

min(D[v3], D[v4]+l(v4,v3))=min(16,12+2)=min(16,14)=14.

Таким чином, D[v3]=14. Вносимо v3 у S: S={v0,v1,v2,v3,v4}. Тепер S=V, отже, алгоритм роботу завершує. Результат обчислень (вартість найкоротшого шляху між v0 та v для кожної вершини v орграфу G, відмінної від v0) зберігається у масиві D. Отже, D[v1]=4, D[v2]=7, D[v3]=14, D[v4]=12. Послідов-ність обчислень для D та S див. на рис.3.

Ітерація

S

w

D[w]

D[v1]

D[v2]

D[v3]

D[v4]

Початкове значення

{v0}

-

-

4

8

+ ∞

14

1

{v0, v1}

v1

4

4

7

+ ∞

14

2

{v0, v1, v2}

v2

7

4

7

16

12

3

{v0, v1, v2, v4}

v4

12

4

7

14

12

4

{v0, v1, v2, v4, v3}

v3

14

4

7

14

12

Рис.3

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]