c++的Dijkstra算法的代码
时间: 2023-11-12 17:22:44 浏览: 83
以下是使用优先队列实现Dijkstra算法的C++代码:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;
typedef pair<int, int> pii;
vector<vector<pii>> graph; // 邻接表表示的图
vector<int> dist; // 存储起点到每个顶点的最短距离
void dijkstra(int start) {
dist[start] = 0;
priority_queue<pii, vector<pii>, greater<pii>> pq;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
for (auto& edge : graph[u]) {
int v = edge.first;
int w = edge.second;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push(make_pair(dist[v], v));
}
}
}
}
int main() {
int n, m;
cin >> n >> m; // 输入顶点数和边数
graph.resize(n+1);
dist.resize(n+1, INT_MAX);
// 构建邻接表表示的图
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u].push_back(make_pair(v, w));
graph[v].push_back(make_pair(u, w)); // 如果是无向图,需要加上这句
}
int start;
cin >> start; // 输入起点
dijkstra(start);
// 输出起点到每个顶点的最短距离
for (int i = 1; i <= n; i++) {
cout << "dist[" << start << "][" << i << "] = " << dist[i] << endl;
}
return 0;
}
```
其中,graph是邻接表表示的图,dist是存储起点到每个顶点的最短距离的vector。代码中使用了STL的优先队列模板类priority_queue来实现从待扩展顶点集合中选择距离起点最近的顶点。
阅读全文