dijkstra算法c++
时间: 2023-09-24 10:09:51 浏览: 129
以下是使用C++实现Dijkstra算法的示例代码:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;
typedef pair<int, int> pii;
const int INF = numeric_limits<int>::max();
void dijkstra(const vector<vector<pii>>& graph, int source, vector<int>& dist) {
int n = graph.size();
dist.assign(n, INF);
dist[source] = 0;
priority_queue<pii, vector<pii>, greater<pii>> pq;
pq.push({0, source});
while (!pq.empty()) {
int d = pq.top().first;
int u = pq.top().second;
pq.pop();
if (d > dist[u]) continue;
for (const auto& edge : graph[u]) {
int v = edge.first;
int w = edge.second;
if (dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
pq.push({dist[v], v});
}
}
}
}
int main() {
int n, m, s;
cin >> n >> m >> s;
vector<vector<pii>> graph(n);
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u].push_back({v, w});
}
vector<int> dist;
dijkstra(graph, s, dist);
for (int i = 0; i < n; i++) {
if (dist[i] == INF) cout << "INF" << endl;
else cout << dist[i] << endl;
}
return 0;
}
```
其中,`graph`是一个邻接表,表示图中的边和权重;`source`是起点;`dist`是到达每个顶点的最短距离。在算法中,我们使用一个优先队列来维护到每个顶点的最短距离,每次从队首取出距离最小的顶点进行松弛操作。算法的时间复杂度为$O((m+n)\log n)$,其中$m$为边数,$n$为顶点数。
阅读全文