Что делает: находит кратчайшие расстояния от одной вершины до всех остальных в взвешенном ациклическом ориентированном графе
Чего | Точная оценка | Почему |
---|---|---|
Время | O( | V |
Память | O(V) | похуй |
Общая идея:
Релаксация рёбер в порядке топологической сортировки
Реализация:
1. Топологическая сортировка вершин графа
2. Инициализация расстояний и родителей
3. for каждой вершины в порядке топсорта
for каждой смежной вершины
Релаксация ребра
int main() {
for u из G(V) do {
u.distance = INF
u.parent = NULL
}
s.distance = 0 // инициализируем стартовую вершину
Topsort(graph) // топологически сортируем вершины графа
for u из G(V).topsorted
for v смежной u
Relax(edge(u,v))
}
void Relax(edge) {
v.distance = min(v.distance, u.distance + edge.weight)
if v.distance changes:
v.parent = u
}
‼ Особенности алгоритма нахождения кратчайших путей в DAG:
Визуализация: этим я займусь чуть попозже