Сравнительный анализ алгоритмов
Рассмотрим неориентированный граф с вершинами 1, 2, 3, 4 и рёбрами:
Рисунок 1. Неориентированный граф
Таблица 1 - Исходная матрица расстояний
-
1
2
3
4
1
0
2
5
∞
2
2
0
1
4
3
5
1
0
3
4
∞
4
3
0
3.1. Пример работы алгоритма Флойда-Уоршелла
Шаг 1. Разрешаем вершину 1 как промежуточную. Проверяем все пары (i,j):
2→3: 2→1→3 = 2+5 = 7 > текущего 1 → не меняем.
2→4: 2→1→4 = 2+∞ = ∞ → не меняем.
3→4: 3→1→4 = 5+∞ = ∞ → не меняем. Остальные пары не улучшаются. Результат: матрица без изменений.
Шаг 2. Разрешаем вершину 2.
1→3: было 5, через 2: 1→2→3 = 2+1 = 3 → обновляем (теперь 3).
1→4: было ∞, через 2: 1→2→4 = 2+4 = 6 → обновляем (теперь 6).
3→4: было 3, через 2: 3→2→4 = 1+4 = 5 → не меняем (3 < 5).
Матрица после шага 2:
Таблица 2. Матрица расстояний после 2 шага
|
1 |
2 |
3 |
4 |
1 |
0 |
2 |
3 |
6 |
2 |
2 |
0 |
1 |
4 |
3 |
3 |
1 |
0 |
3 |
4 |
6 |
4 |
3 |
0 |
Шаг 3. Разрешаем вершину 3.
1→4: было 6, через 3: 1→3→4 = 3+3 = 6 → не меняем.
2→4: было 4, через 3: 2→3→4 = 1+3 = 4 → не меняем.
Изменений нет.
Шаг 4. Разрешаем вершину 4.
1→2: 1→4→2 = 6+4 = 10 > 2 → нет.
1→3: 1→4→3 = 6+3 = 9 > 3 → нет.
2→3: 2→4→3 = 4+3 = 7 > 1 → нет.
Изменений нет.
Финальная матрица — кратчайшие расстояния между всеми парами:
Таблица 3. Финальная матрица расстояний
|
1 |
2 |
3 |
4 |
1 |
0 |
2 |
3 |
6 |
2 |
2 |
0 |
1 |
4 |
3 |
3 |
1 |
0 |
3 |
4 |
6 |
4 |
3 |
0 |
Пример работы алгоритма Дейкстры
Используем тот же граф (рис. 1).
Инициализируем посещённые и непосещённые вершины dist[1]=0, dist[2]=∞, dist[3]=∞, dist[4]=∞. Непосещённые: {1,2,3,4}.
Шаг 1
Среди непосещённых минимальное dist у вершины 1 (0). Убираем 1. Смотрим соседей:
2: dist[2] = min(∞, 0+2) = 2.
3: dist[3] = min(∞, 0+5) = 5. 4 не смежна с 1.
Теперь: dist[1]=0 (посещена), dist[2]=2, dist[3]=5, dist[4]=∞.
Шаг 2
Непосещённые {2,3,4}, минимальный dist у 2 (2). Убираем 2. Соседи 2:
1 уже посещена, пропускаем.
3: dist[3] = min(5, 2+1) = 3.
4: dist[4] = min(∞, 2+4) = 6.
Теперь: dist[2]=2 (посещена), dist[3]=3, dist[4]=6.
Шаг 3
Непосещённые {3,4}, минимальный у 3 (3). Убираем 3. Соседи 3:
1,2 посещены.
4: dist[4] = min(6, 3+3) = 6 (не улучшается). Теперь: dist[3]=3 (посещена), dist[4]=6.
Шаг 4
Непосещённые {4}, минимальный 4 (6). Убираем 4. Все соседи (2,3) уже посещены. Алгоритм завершён.
Результат (расстояния от вершины 1):
до 2: 2
до 3: 3
до 4: 6
Это совпадает с первой строкой матрицы, полученной методом Флойда–Уоршелла (табл. 3).
Для получения полной матрицы кратчайших расстояний необходимо так же запустить алгоритм Дейкстры отдельно от каждой вершины (1, 2, 3, 4).
