请写一份用c++语言实现的dijkstra算法(邻接表版本)的代码
时间: 2024-12-12 13:19:37 浏览: 6
Dijkstra算法是一个用于寻找图中两点之间最短路径的著名算法。这里我将为你提供一个C++实现的邻接表版本的Dijkstra算法示例:
```cpp
#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;
// 图节点结构体
struct Node {
int id;
vector<pair<int, int>> adj; // 邻接列表表示邻居和边权
};
// 边权重比较函数
bool compare(const pair<int, int>& a, const pair<int, int>& b) {
return a.first < b.first;
}
// Dijkstra算法
void dijkstra(Node* graph, int source, int V) {
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&compare)> pq(compare);
bool visited[V] = {false};
int dist[V]; // 存储从源点到各个顶点的距离
for (int i = 0; i < V; ++i)
dist[i] = INT_MAX;
dist[source] = 0;
pq.push({0, source});
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (visited[u])
continue;
visited[u] = true;
// 探索u的所有未访问邻居
for (const auto& neighbor : graph[u].adj) {
int v = neighbor.first;
int weight = neighbor.second;
if (dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight;
pq.push({dist[v], v});
}
}
}
// 输出最短距离
cout << "Vertex\tDistance from Source\n";
for (int i = 0; i < V; ++i)
cout << i << "\t" << (dist[i] == INT_MAX ? "INF" : dist[i]) << endl;
}
int main() {
// 示例:创建一个简单的邻接表表示的图
Node vertices[] = {
{0, {{1, 5}, {2, 3}}},
{1, {{0, 5}, {3, 1}}},
{2, {{0, 3}, {3, 4}}},
{3, {{1, 1}, {2, 4}, {4, 2}}},
{4, {{2, 4}, {3, 2}}}
};
int num_vertices = sizeof(vertices) / sizeof(vertices);
dijkstra(vertices, 0, num_vertices); // 从顶点0开始搜索
return 0;
}
```
这个代码首先定义了一个`Node`结构体表示图中的每个节点,然后实现了一个优先队列来按照边的权重排序。在`dijkstra`函数中,我们初始化了距离数组、访问标记和优先队列,然后执行遍历过程,直到找到所有顶点的最短路径。
在`main`函数中,我们创建了一个简单的邻接表表示图实例,并调用`dijkstra`函数从第一个顶点开始查找最短路径。
阅读全文