最短路径问题旨在从带权有向图中找到从一个顶点到另一个顶点的路径,使得路径上各边的权值总和最小。在实际工程中,这通常涉及网络路由、地图导航等场景。
Dijkstra 算法
Dijkstra 是单源最短路径的经典贪心算法,适用于没有负权边的图。它的核心思想是从起点出发,每次选择当前距离最小且未确定最短路径的节点,用它去松弛(更新)所有邻接点的最短路径估计值,标记该节点为'已确定',重复此过程直到所有节点处理完毕。

下面是一个基于邻接矩阵实现的 Dijkstra 函数。注意这里假设存在一个 Graph 类,包含 _matrix 和 _vertexs 成员变量。
void Dijkstra(const V& src, vector<W>& dist, vector<int>& pPath) {
size_t srci = GetVertexIndex(src);
size_t n = _vertexs.size();
// 初始化距离数组和前驱节点数组
dist.resize(n, MAX_W);
pPath.resize(n, -1);
dist[srci] = 0;
pPath[srci] = srci; // 起点的前驱指向自己
// S 集合记录已确定最短路径的顶点
vector<bool> S(n, false);
for (size_t j = 0; j < n; ++j) {
// 1. 选最短路径顶点且不在 S 中
int u = 0;
W minDist = MAX_W;
for (size_t i = 0; i < n; ++i) {
if (!S[i] && dist[i] < minDist) {
u = i;
minDist = dist[i];
}
}
S[u] = true;
// 2. 松弛更新 u 连接顶点 v
( v = ; v < n; ++v) {
(!S[v] && _matrix[u][v] != MAX_W && dist[u] + _matrix[u][v] < dist[v]) {
dist[v] = dist[u] + _matrix[u][v];
pPath[v] = u;
}
}
}
}



