迪杰克斯拉算法返回的是两点间最短路径c++代码实现
时间: 2024-03-22 20:38:38 浏览: 67
以下是使用C++实现的迪杰斯拉算法代码,用于求解两点间的最短路径:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
const int INF = INT_MAX; // 定义正无穷
vector<vector<pair<int, int>>> adj; // 邻接表,存储图的信息
vector<int> dijkstra(int source, int n) {
vector<int> dist(n, INF); // 存储起点到各个顶点的最短距离
dist[source] = 0; // 到自己的距离为0
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 小根堆,存储顶点编号和距离
pq.push(make_pair(0, source)); // 将起点加入堆中
while (!pq.empty()) {
int u = pq.top().second; // 取出堆顶元素
pq.pop();
for (auto& p : adj[u]) { // 遍历当前顶点的所有邻居
int v = p.first; // 邻居编号
int weight = p.second; // 边的权值
if (dist[u] + weight < dist[v]) { // 如果新路径比原路径更短
dist[v] = dist[u] + weight; // 更新最短距离
pq.push(make_pair(dist[v], v)); // 将邻居加入堆中
}
}
}
return dist; // 返回起点到各个顶点的最短距离
}
int main() {
int n, m, source, destination;
cin >> n >> m >> source >> destination;
adj.resize(n);
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back(make_pair(v, w)); // 添加邻接表中的边
}
vector<int> dist = dijkstra(source, n);
if (dist[destination] == INF) {
cout << "No path found from " << source << " to " << destination << endl;
} else {
cout << "The shortest path from " << source << " to " << destination << " is " << dist[destination] << endl;
}
return 0;
}
```
在输入中,$n$表示顶点数,$m$表示边数,$source$和$destination$分别表示起点和终点。每个边有三个整数$u$、$v$和$w$,表示从顶点$u$到顶点$v$有一条权值为$w$的边。程序输出起点到终点的最短距离。
阅读全文