
- •Міністерство освіти та науки України
- •Рішення задач на графах Знаходження шляху мінімальної сумарної довжини у зваженому графі з невід’ємними вагами. Алгоритм Дейкстрі
- •Побудова остовного дерева. Алгоритм краскала
- •Задача листоноші
- •Задача листоноші для неорієнтованого графу
- •Задача листоноші для орієнтованого графу
- •Рішення задачі комівояжера. Алгоритм литтла Постановка задачі
- •Рішення задачі
- •Завдання на розрахункову роботу
- •Варіанти завдань
- •Навчальне видання
Міністерство освіти та науки України
Національний університет "Львівська політехніка"
РІШЕННЯ ЗАДАЧ НА ГРАФАХ
МЕТОДИЧНІ ВКАЗІВКИ
до виконання розрахунково-графічної роботи
з курсу “Інформатика інфокомунікаційних систем”
для студентів базового напрямку 050902 „Радіоелектронні апарати”
Затверджено
на засіданні кафедри
"Електронні засоби інформаційно-комп’ютерних технологій"
Протокол № ....
від „.....” .............. 2010р.
Львів - 2010
Рішення задач на графах. Методичні вказівки до виконання розрахунково-графічної роботи з курсу “Інформатика інфокомунікаційних систем” для студентів базового напрямку 050902 „Радіоелектронні апарати”. Укл. І.В. Атаманова, К.І. Янгурський. - Львів: НУ "ЛП", 2010. - 24 с.
Укладачі І.В. Атаманова, к.т.н., доц.
К.І. Янгурський, к.т.н., доц.
Відповідальний за випуск Т.А. Смердова, к.т.н., доц.
Рецензент Є.В. Сторчун, д.т.н., проф.
Рішення задач на графах Знаходження шляху мінімальної сумарної довжини у зваженому графі з невід’ємними вагами. Алгоритм Дейкстрі
Формальне визначення
Даний зважений орієнтований граф G(X, V) без петель і дуг негативної ваги.
Знайти найкоротші шляхи від деякої вершини a графа G до усіх інших вершин цього графа.
Класичним алгоритмом рішення цієї задачі є алгоритм Дейкстри.
Неформальне пояснення
Кожній вершині з X зіставимо мітку — мінімальна відома відстань від цієї вершини до a. Алгоритм працює покроково — на кожному кроці він «відвідує» одну вершину і намагається зменшувати мітки. Робота алгоритму завершується, коли усі вершини відвідані.
Ініціалізація. Мітка самої вершини a вважається рівною 0, мітки інших вершин — нескінченність. Це відображає те, що відстані від a до інших вершин доки невідомі. Усі вершини графа позначаються як невідвідані.
Крок алгоритму. Якщо усі вершини відвідані, алгоритм завершується. Інакше, з ще не відвіданих вершин вибирається вершина u, що має мінімальну мітку. Ми розглядаємо всілякі маршрути, в яких u є передостаннім пунктом. Вершини, в які ведуть ребра з u, назвемо сусідами цієї вершини. Для кожного сусіда вершини u, окрім відмічених як відвідані, розглянемо нову довжину шляху, рівну сумі значень поточної мітки u і довжини ребра, яке сполучає вершину u з цим сусідом.
d(u) := min{d(u), d(t) + W[t, u]} (1)
Якщо отримане значення довжини менше значення мітки сусіда, замінимо значення мітки отриманим значенням довжини. Розглянувши усіх сусідів, помітимо вершину u як відвідану і повторюваний крок алгоритму.
Алгоритм Дейкстри будує множину S вершин, для яких найкоротші шляхи від джерела вже відомі. На кожному кроці до множини S додається та із вершин, відстань до якої від джерела менша, ніж до інших вершин. Оскільки ваги дуг невід’ємні, то найкоротший шлях від джерела до конкретної вершини із множини S буде проходити лише через вершини з S. На кожному кроці алгоритму використовується масив d, в який записуються довжини найкоротших особливих шляхів для кожної вершини. Коли множина S буде містити всі вершини графа (для всіх вершин будуть знайдені особливі шляхи), тоді масив d буде містити довжини найкоротших шляхів від джерела до кожної вершини.
Рис. 1. Орієнтований граф
Приклад. Розглянемо граф, поданий на рисунку 1. Нехай вершина 4 буде джерелом. Тоді ініціюємо S = {4}. Для кожного значення k покладемо d[k] рівному відстані від вершини 4 до вершини k, якщо існує ребро, яке їх сполучає, та максимальному натуральному числу, якщо такого ребра не існує. d[4] = 0, оскільки відстань від вершини до її ж самої дорінює 0.
На першій ітерації знаходимо мінімальне значення серед d[i], де і – вершина, яка ще не війшла у S. Min{ d[1], d[2], d[3], d[5], d[6] } = 5. Отже наступною буде включена до множини S вершина 1. Далі перераховуємо значення d[i] для всіх i V \ S = {2, 3, 5, 6} згідно з (1):
d[2] = min( d[2], d[1] + C[1, 2] ) = min(+ , 5 + 10) = 15;
d[3] = min( d[3], d[1] + C[1, 3] ) = min(16, 5 + ) = 16;
d[5] = min( d[5], d[1] + C[1, 5] ) = min(+ , 5 + 2) = 7;
d[6] = min( d[6], d[1] + C[1, 6] ) = min(+ , 5 + ) = +;
Результат виконання наступних ітерацій подано в таблиці 1. Вершину w, яка обирається та додається до S на кожному кроці, виділено та підкреслено. Значення d[i], для яких i S, виділено курсивом.
Ітеративний процес алгоритма Дейкстри
-
Ітерація
S
D[1]
D[2]
D[3]
D[4]
D[5]
D[6]
початок
{4}
5
+
16
0
+
+
1
{1, 4}
5
15
16
0
7
+
2
{1, 4, 5}
5
15
16
0
7
14
3
{1, 4, 5, 6}
5
15
16
0
7
14
4
{1, 2, 4, 5, 6}
5
15
16
0
7
14
5
{1, 2, 3, 4, 5, 6}
5
15
16
0
7
14