编写以邻接表作存储结构实现求从源点到其余各顶点的最短路径的Dijkstra算法。
时间: 2024-02-18 15:06:12 浏览: 85
好的,下面是用C++编写以邻接表作存储结构实现求从源点到其余各顶点的最短路径的Dijkstra算法的代码示例:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <climits> // for INT_MAX
using namespace std;
// 边的结构体
struct Edge {
int v; // 目标顶点
int w; // 权值
Edge(int _v, int _w) : v(_v), w(_w) {}
};
// 邻接表的结构体
struct Graph {
int V; // 顶点数
vector<vector<Edge>> adj; // 邻接表
Graph(int V) : V(V), adj(V) {} // 初始化邻接表
};
// Dijkstra算法
vector<int> dijkstra(Graph& g, int s) {
vector<int> dist(g.V, INT_MAX); // 初始化距离
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 优先队列
pq.push(make_pair(0, s)); // 将源点加入队列
dist[s] = 0; // 源点到源点的距离为0
while (!pq.empty()) {
int u = pq.top().second; // 取出优先队列中距离源点最近的顶点u
pq.pop();
for (auto& e : g.adj[u]) { // 遍历顶点u的所有邻居v
int v = e.v;
int w = e.w;
if (dist[u] != INT_MAX && dist[v] > dist[u] + w) { // 如果源点到v的距离经过u更短,则更新距离
dist[v] = dist[u] + w;
pq.push(make_pair(dist[v], v)); // 将v加入队列
}
}
}
return dist;
}
int main() {
int V = 5; // 顶点数
Graph g(V);
g.adj[0].push_back(Edge(1, 10));
g.adj[0].push_back(Edge(4, 5));
g.adj[1].push_back(Edge(2, 1));
g.adj[1].push_back(Edge(4, 2));
g.adj[2].push_back(Edge(3, 4));
g.adj[3].push_back(Edge(0, 7));
g.adj[3].push_back(Edge(2, 6));
g.adj[4].push_back(Edge(1, 3));
g.adj[4].push_back(Edge(2, 9));
g.adj[4].push_back(Edge(3, 2));
vector<int> dist = dijkstra(g, 0);
for (int i = 0; i < dist.size(); i++) {
cout << "dist[" << i << "] = " << dist[i] << endl;
}
return 0;
}
```
这里使用了STL中的优先队列来实现Dijkstra算法。由于需要将距离源点最近的顶点放在队列的前面,所以我们使用了一个小根堆,并将距离和顶点编号作为pair放入队列中。同时,为了方便更新距离,我们使用了vector<vector<Edge>>来存储邻接表。
阅读全文