给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的长度。这里的长度就是指路上各边权之和。请你给出c++代码实现
时间: 2024-02-18 12:59:12 浏览: 90
带权图的多种算法(有向图,无向图,Dijkstra算法,到每个顶点的最短距离算法,佛洛依德算法(Floyd),找出每对顶点的最短路径,带权重无向图最小生成树,prim算法,Kruskal算法求最小生成树)java实现,有注释
5星 · 资源好评率100%
以下是使用 Dijkstra 算法解决单源最短路径问题的C++代码:
```c++
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f; // 表示无穷大
struct Edge {
int v; // 目标节点
double w; // 边权重
Edge(int _v, double _w) : v(_v), w(_w) {}
};
vector<Edge> adj[1000]; // 邻接表存储图
double dist[1000]; // 存储源点到各顶点的最短距离
void dijkstra(int s) {
priority_queue<pair<double, int>, vector<pair<double, int>>, greater<>> pq; // 小根堆
memset(dist, INF, sizeof(dist)); // 初始化距离为无穷大
dist[s] = 0; // 源点距离为0
pq.push({0, s}); // 将源点加入堆中
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > dist[u]) continue; // 如果堆顶元素已经不是最短距离,则跳过
for (auto e : adj[u]) {
if (dist[e.v] > dist[u] + e.w) { // 更新距离
dist[e.v] = dist[u] + e.w;
pq.push({dist[e.v], e.v}); // 将新的最短距离加入堆中
}
}
}
}
int main() {
int n, m, s;
cin >> n >> m >> s; // 顶点数、边数、源点
for (int i = 0; i < m; i++) {
int u, v;
double w;
cin >> u >> v >> w;
adj[u].push_back(Edge(v, w)); // 加入边(u, v)
}
dijkstra(s); // 计算最短距离
for (int i = 1; i <= n; i++) {
cout << "dist[" << i << "] = " << dist[i] << endl; // 输出结果
}
return 0;
}
```
该算法的时间复杂度为 $O(m \log n)$,其中 $n$ 为顶点数,$m$ 为边数。
阅读全文