讲解要点
- dist 数组:记录从源点到每个点的当前最短估计值。
- 确定点:每轮选出未确定点里 dist 最小的点,它的最短路就固定下来。
- 松弛操作:若
dist[u] + w(u,v) 更小,就更新 dist[v] 和前驱。
- 使用条件:Dijkstra 要求边权非负;有负权边时这个“当前最小即可确定”的判断会失效。
- 复杂度:本页代码写法为
O(n^2 + m),适合讲解和中小规模图。
C++ 核心代码
const int INF = 0x3f3f3f3f;
vector<int> dist(n + 1, INF), pre(n + 1, -1);
vector<bool> used(n + 1, false);
dist[s] = 0;
for (int step = 1; step <= n; step++) {
int u = -1;
for (int i = 1; i <= n; i++) {
if (!used[i] && (u == -1 || dist[i] < dist[u])) {
u = i;
}
}
if (u == -1 || dist[u] == INF) break;
used[u] = true;
for (auto edge : graph[u]) {
int v = edge.to;
int w = edge.w;
if (!used[v] && dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
pre[v] = u;
}
}
}