Кратчайший путь в ациклическом графе
Пусть дан ациклический ориентированный взвешенный граф. Требуется найти вес кратчайшего пути из u в v
Определение: |
Кратчайший путь из u в v – это такой путь из u в v, что его суммарный вес входящих в него ребер минимален |
Содержание
Решение
Пусть топологической сортировки. Получаем следующие соотношения:
Так как мы обходим граф в порядке топологической сортировки, то на -ом шаге всем ( такие, что существует ребро из в ) уже присвоены оптимальные ответы, и, следовательно, также будет присвоен оптимальный ответ.
Реализация
Реализуем данный алгоритм:
//w — матрица смежности //d — массив кратчайших расстояний //p — массив индексов вершин графа в порядке топологической сортировки for i = 1 .. n d[i] = infinity d[u] = 0 // где u — начальная вершина
p = topSort(w) //топологическая сортировка графа for i = 1 .. n for j: есть ребро из p[i] в j d[j] = min(d[j], d[p[i]] + w[p[i]][j])
Пример
Пусть дана матрица смежности графа w со следующими весами ребер:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
1 | - | - | - | 5 | - | - | - | - |
2 | 1 | - | 1 | - | 4 | 3 | - | - |
3 | - | - | - | - | - | 1 | - | - |
4 | - | - | - | - | - | - | - | - |
5 | - | - | - | 3 | - | - | - | 1 |
6 | - | - | - | 5 | - | - | 2 | - |
7 | - | - | - | 2 | - | - | - | - |
8 | - | - | - | 1 | - | - | - | - |
Требуется найти путь из 2 в 4.
Массив p будет выглядеть следующим образом:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
2 | 3 | 6 | 7 | 1 | 5 | 8 | 4 |
Массив d будет выглядеть следующим образом:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
1 | 0 | 1 | 5 | 3 | 2 | 4 | 4 |
Ответ равен 5.
Альтернативный способ решения
Задачу так же можно решить поиском в ширину. Для этого будем поддерживать массив кратчайший расстояний от начальной до текущей вершины. Обходя граф в ширину, будем для каждой вершины обновлять ответы у ее сыновей как минимум из старого значения и пути, проходящего через текущую вершину.
В силу особенности обхода графа, когда происходит обновление сыновей вершины, для нее самой уже найден оптимальный ответ.