ДейкстраБеллман-ФордКратчайшие путиГрафы
2 мин чтение
Кратчайшие пути в графах: Дейкстра, Беллман-Форд и поиск в DAG
Теория ослабления (релаксации) ребер и 6 фундаментальных свойств. Кратчайшие пути в DAG за O(V+E). Алгоритм Дейкстры с кучей за O((V+E) log V). Алгоритм Беллмана-Форда с детектированием отрицательных циклов.
Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.
Процедура релаксации (Relaxation)
cpp
void relax(int u, int v, int w, vector<int>& d, vector<int>& p) {
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
p[v] = u;
}
}
6 фундаментальных свойств кратчайших путей:
1. Алгоритм Дейкстры: (для )
cpp
vector<int> dijkstra(int s, int n, const vector<vector<pair<int, int>>>& adj) {
vector<int> dist(n, 1e9);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
dist[s] = 0;
pq.push({0, s});
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > dist[u]) continue;
for (auto [v, w] : adj[u]) {
if (dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
pq.push({dist[v], v});
}
}
}
return dist;
}
2. Алгоритм Беллмана-Форда:
Выполняет итерацию релаксации всех ребер. Если на -м проходе какое-то расстояние уменьшается — в графе есть цикл отрицательного веса!
Что дальше?
Закрепите материал задачей: Повторить число.
Изучено — к практике →Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».