dijkstra最短路径算法c++实现
时间: 2023-08-28 14:05:10 浏览: 104
Dijkstra最短路径算法的C++实现
好的,以下是Dijkstra最短路径算法的C++实现。假设我们有一个无向图,节点编号为0到n-1,图的邻接矩阵为graph。
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <limits.h> // for INT_MAX
using namespace std;
// Dijkstra最短路径算法
void Dijkstra(vector<vector<int>>& graph, int start)
{
int n = graph.size();
// 存储每个节点的最短路径
vector<int> dist(n, INT_MAX);
// 起点到起点的距离为0
dist[start] = 0;
// 存储已经处理过的节点
vector<bool> visited(n, false);
// 优先队列,按照距离排序
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
// 把起点加入队列
pq.push({0, start});
while (!pq.empty())
{
// 取出队首节点
int u = pq.top().second;
pq.pop();
// 如果已经处理过,跳过
if (visited[u]) continue;
// 标记为已处理
visited[u] = true;
// 更新相邻节点的最短路径
for (int v = 0; v < n; ++v)
{
// 如果节点v未处理过,且u到v有边
if (!visited[v] && graph[u][v])
{
// 如果通过u到v的距离更短
if (dist[u] + graph[u][v] < dist[v])
{
// 更新最短路径
dist[v] = dist[u] + graph[u][v];
// 把节点加入队列
pq.push({dist[v], v});
}
}
}
}
// 输出最短路径
for (int i = 0; i < n; ++i)
{
cout << "Start " << start << " to " << i << " : " << dist[i] << endl;
}
}
int main()
{
// 无向图的邻接矩阵
vector<vector<int>> graph = {
{0, 1, 4, 0, 0},
{1, 0, 2, 7, 0},
{4, 2, 0, 3, 5},
{0, 7, 3, 0, 2},
{0, 0, 5, 2, 0}
};
Dijkstra(graph, 0);
return 0;
}
```
这个算法的时间复杂度为O(nlogn),其中n为节点数。
阅读全文