Shortest Path DP
Shortest Path DP
Bellman-Ford DP
Setup:
- Input: A directed graph with edge weights , a source node , and a target node .
- Output: The length of the shortest path from to .
Steps:
- Subproblem: be the shortest path from source node to node with at most edges.
- Recurrence relation:
- Answer: .
int BellmanFord(int n, int m, vector<tuple<int, int, int>> edges, int s, int t) {
vector<int> d(n, INT_MAX);
d[s] = 0;
for (int i = 1; i < n; i++) {
for (auto [u, v, w] : edges) {
if (d[u] != INT_MAX) {
d[v] = min(d[v], d[u] + w);
}
}
}
return d[t] == INT_MAX ? -1 : d[t];
}
Floyd-Warshall DP
Setup:
- Input: A directed graph with edge weights .
- Output: A matrix where is the length of the shortest path from vertex to vertex .
Steps:
- Subproblem: be the length of the shortest path from vertex to vertex using only intermediate vertices from the set .
- Recurrence relation:
- Answer: for all pairs .
bool floyd_warshall(vector<vector<int>>& dis, vector<vector<int>>& w) {
int n = dis.size() - 1;
dis.assign(n + 1, vector<int>(n + 1, INF / 2));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
dis[i][j] = w[i][j];
dis[i][i] = min(dis[i][i], 0);
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
for (int i = 1; i <= n; i++)
if (dis[i][i] < 0) return false; // negative cycle exists
return true;
}