C++ 语言 实现 Dijkstra 最短路径

C++阿木 发布于 2025-06-14 11 次阅读


阿木博主一句话概括:C++实现Dijkstra最短路径算法:原理与代码解析

阿木博主为你简单介绍:
Dijkstra算法是一种经典的图算法,用于在加权图中找到单源最短路径。本文将围绕C++语言,详细介绍Dijkstra算法的原理,并给出一个完整的C++实现示例。文章将涵盖算法的基本概念、时间复杂度分析、代码实现以及一些优化技巧。

一、
Dijkstra算法是图论中求解单源最短路径问题的一种有效方法。它由荷兰计算机科学家Edsger Dijkstra在1959年提出。Dijkstra算法适用于有向图和无向图,但要求图中所有边的权重均为非负值。本文将重点介绍如何在C++中实现Dijkstra算法。

二、Dijkstra算法原理
Dijkstra算法的基本思想是维护一个集合S,用于存储已经确定最短路径的顶点。算法开始时,集合S只包含源点,其余顶点均属于集合U(未确定最短路径的顶点集合)。算法的每一步,都会从集合U中选取一个顶点v,使得v到源点s的最短路径长度最小,并将v加入到集合S中。更新所有与v相邻的顶点的最短路径长度。

具体步骤如下:
1. 初始化:将源点s的最短路径长度设为0,其余顶点的最短路径长度设为无穷大;将所有顶点加入集合U。
2. 循环执行以下步骤,直到集合U为空:
a. 从集合U中选取一个顶点v,使得v到源点s的最短路径长度最小。
b. 将v从集合U中移除,加入到集合S中。
c. 更新所有与v相邻的顶点的最短路径长度。
3. 输出所有顶点的最短路径长度。

三、时间复杂度分析
Dijkstra算法的时间复杂度主要取决于两个因素:顶点数量和边数量。在每次循环中,算法需要从集合U中选取一个顶点,这需要O(V)的时间复杂度。对于每条边,算法需要检查是否更新了与该边相邻的顶点的最短路径长度,这需要O(E)的时间复杂度。Dijkstra算法的时间复杂度为O(V^2)。

四、C++实现
以下是一个使用C++实现的Dijkstra算法示例:

cpp
include
include
include

using namespace std;

const int INF = INT_MAX;

void dijkstra(const vector<#vector<#pair>>& graph, int source) {
int V = graph.size();
vector dist(V, INF);
vector visited(V, false);

dist[source] = 0;

for (int i = 0; i < V - 1; ++i) {
int u = -1;
for (int v = 0; v < V; ++v) {
if (!visited[v] && (u == -1 || dist[v] < dist[u])) {
u = v;
}
}

visited[u] = true;

for (auto& p : graph[u]) {
int v = p.first;
int weight = p.second;
if (!visited[v] && dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight;
}
}
}

for (int i = 0; i < V; ++i) {
cout << "Vertex " << i << " distance from source " << source << ": " << dist[i] << endl;
}
}

int main() {
int V = 5;
vector<#vector<#pair>> graph(V);

// 构建图
graph[0].push_back(make_pair(1, 10));
graph[0].push_back(make_pair(2, 3));
graph[1].push_back(make_pair(2, 1));
graph[1].push_back(make_pair(3, 2));
graph[1].push_back(make_pair(4, 4));
graph[2].push_back(make_pair(3, 9));
graph[3].push_back(make_pair(4, 7));
graph[4].push_back(make_pair(3, 8));

dijkstra(graph, 0);

return 0;
}

五、优化技巧
1. 使用优先队列(最小堆)来优化顶点的选取过程,将时间复杂度降低到O((V+E)logV)。
2. 使用Floyd-Warshall算法处理带有负权边的图,但这种方法的时间复杂度较高,适用于顶点数量较少的图。

六、总结
本文介绍了Dijkstra算法的原理、时间复杂度分析以及C++实现。通过本文的学习,读者可以掌握Dijkstra算法的基本概念和实现方法,为解决实际图论问题打下基础。在实际应用中,可以根据具体需求对算法进行优化,以提高算法的效率。