基于包含负权边的有向图,展示 Dijkstra 贪心松弛与 SPFA 循环松弛队列的物理表现对比
单源最短路算法是图论的核心基础。当图中包含负边权时,算法的物理机制会发生本质的偏转。
dist[v] > dist[u] + w):
dist[v]。// SPFA 最短路算法 (基于队列松弛)
void spfa(int start) {
fill(dist, dist + n + 1, INF);
dist[start] = 0;
queue<int> q;
q.push(start); in_queue[start] = true;
while (!q.empty()) {
int u = q.front(); q.pop();
in_queue[u] = false;
for (auto edge : adj[u]) {
int v = edge.v, w = edge.w;
if (dist[v] > dist[u] + w) { // 松弛成功!
dist[v] = dist[u] + w;
if (!in_queue[v]) { // 若不在队列,则压入重松弛
q.push(v);
in_queue[v] = true;
}
}
}
}
}