以邻接表作存储结构实现求从源点到其余各顶点的最短路径的 Dijkstra 算法。
时间: 2023-07-15 21:11:22 浏览: 71
Dijkstra算法邻接表实现
4星 · 用户满意度95%
Dijkstra 算法是一种解决单源最短路径问题的贪心算法,可以用邻接表作为存储结构来实现。下面是伪代码实现:
```
Dijkstra(G, s)
1. 初始化:将所有顶点的最短距离 dist[v] 设为无穷大,将起点 s 的 dist[s] 设为 0,用一个优先队列 Q 存储所有未确定最短路径的顶点,将 s 入队。
2. while Q 不为空:
a. 取出 Q 中 dist 值最小的顶点 u。
b. 对 u 的每个邻居 v 进行松弛操作:
i. 若 dist[v] > dist[u] + w(u, v),则更新 dist[v] = dist[u] + w(u, v)。
ii. 将 v 入队。
3. 返回 dist 数组。
其中,w(u, v) 表示边 (u, v) 的权值。
用邻接表来实现,需要先定义一个邻接表结构体,包含邻接表的头指针和边的信息。
struct EdgeNode { // 边结点
int adjvex; // 边的邻接点编号
int weight; // 边的权值
EdgeNode *next; // 下一条边的指针
};
struct VertexNode { // 顶点结点
int data; // 顶点编号
EdgeNode *firstEdge; // 邻接表头指针
};
struct Graph { // 邻接表存储的图
VertexNode adjList[MAXV]; // 顶点数组
int n, e; // 顶点数和边数
};
然后就可以按照上述 Dijkstra 算法的步骤来实现了。
void Dijkstra(Graph &G, int s, int dist[]) {
bool visited[MAXV] = {false}; // 记录顶点是否已确定最短路径
for (int i = 0; i < G.n; i++) {
dist[i] = INF;
}
dist[s] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;
Q.push(make_pair(dist[s], s));
while (!Q.empty()) {
int u = Q.top().second;
Q.pop();
if (visited[u]) {
continue;
}
visited[u] = true;
for (EdgeNode *e = G.adjList[u].firstEdge; e != NULL; e = e->next) {
int v = e->adjvex;
int w = e->weight;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
Q.push(make_pair(dist[v], v));
}
}
}
}
```
阅读全文