当我们需要在一个带权重的图中找到起始点到目标点的最短路径时,Dijkstra算法是一种较为常见的解决方法。下面,我将为大家详细讲解如何使用C++语言实现Dijkstra算法的完整攻略。
前置知识
在学习本文之前,你需要掌握以下基础知识:
- C++语言基础
- 图的基本概念和表示方法
- 最短路径问题和算法
如果你对上述知识点掌握不够扎实,我建议你先去学习相关基础知识。
什么是Dijkstra算法
Dijkstra算法是一种解决最短路径问题的贪心算法,用于在带权重的图中找到起始点到目标点的最短路径。算法的核心思想是通过不断扩展起点到每个节点的最短路径来逐步扩展最短路径集合,直到找到起点到终点的最短路径为止。
Dijkstra算法的具体实现
以下是Dijkstra算法的具体实现流程:
-
创建一个“已访问节点集合”和一个“未访问节点集合”,将起始点加入“已访问节点集合”,将剩余节点加入“未访问节点集合”。
-
将起始点到各个节点的距离初始化为INFINITY(无穷大),将起始点到起始点的距离设置为0。
-
在“未访问节点集合”中查找到起始点到该节点距离最短的节点,标记该节点为“已访问节点”,并更新该节点周围所有节点的距离。
-
重复步骤3,直到起始点到目标点的最短路径被找到或者“未访问节点集合”为空。
以下是使用C++语言实现Dijkstra算法的完整代码示例:
#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;
typedef pair<int, int> P; // P.first 为距起点的距离, P.second 为节点编号
const int MAX_SIZE = 10000; // 最大节点数
const int INF = INT_MAX; // 无穷大
vector<P> graph[MAX_SIZE]; // 图的邻接表表示
vector<int> dijkstra(int start, int size) {
vector<int> dist(size, INF);
priority_queue<P, vector<P>, greater<P>> q; // 小根堆优化
q.push(P(0, start));
dist[start] = 0;
while(!q.empty()) {
P now = q.top();
q.pop();
int v = now.second;
if(now.first > dist[v]) continue;
for(int i=0; i<graph[v].size(); ++i) {
int to = graph[v][i].second;
int cost = graph[v][i].first;
if(dist[to] > dist[v] + cost) {
dist[to] = dist[v] + cost;
q.push(P(dist[to], to));
}
}
}
return dist;
}
int main() {
int n, m;
cin >> n >> m;
for(int i=0; i<m; ++i) {
int a, b, c;
cin >> a >> b >> c;
graph[a].push_back(make_pair(c, b));
graph[b].push_back(make_pair(c, a));
}
vector<int> dist = dijkstra(0, n);
for(int i=0; i<n; ++i) {
cout << "Dist from 0 to " << i << ": " << dist[i] << endl;
}
return 0;
}
在上面代码实现中,我们先创建一个Priority Queue实现优化,用来记录“未访问节点集合”中到起点距离最小的节点。
然后我们使用邻接表的形式来表示图,把输入的节点和边存储进去。
最后,我们使用dijkstra()函数来返回起始点到所有节点的最短距离,并打印输出每个节点的最短距离。
示例说明
我们来看一个具体的示例,有5个节点(0-4),0节点为起点,我们要求从0节点到其他各节点的最短距离(真实结果可能与示例不同)。
输入:
5 7
0 1 2
0 2 4
1 2 1
1 3 5
2 3 1
2 4 3
3 4 1
输出:
Dist from 0 to 0: 0
Dist from 0 to 1: 2
Dist from 0 to 2: 3
Dist from 0 to 3: 4
Dist from 0 to 4: 5
从输出结果我们可以看出,0节点到其他节点的最短距离符合预期。
总结
以上就是关于使用C++语言实现Dijkstra算法的完整攻略,希望本文能给大家带来帮助。如果您有任何问题或疑问,请在评论区留言,我会尽快回复您的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现Dijkstra(迪杰斯特拉)算法 - Python技术站