短路径问题实际上是带权有向图(网)的一种应用,用Dijkstra算法求两个顶点间的最短路径 c++
时间: 2023-11-27 11:51:39 浏览: 80
C++求所有顶点之间的最短路径(用Dijkstra算法)
是的,短路径问题可以用Dijkstra算法来求解。Dijkstra算法是一种贪心算法,用于求带权有向图中单个源点到其它所有顶点的最短路径。
以下是C++代码实现Dijkstra算法:
```
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 10010;
const int INF = 1e9;
struct Edge {
int to, cost;
Edge(int _to, int _cost) {
to = _to;
cost = _cost;
}
};
vector<Edge> G[MAXN]; // 邻接表存图
int d[MAXN]; // 距离数组
bool used[MAXN]; // 是否已经确定了最短距离
void dijkstra(int s) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
memset(d, INF, sizeof(d));
memset(used, false, sizeof(used));
d[s] = 0;
pq.push(make_pair(0, s));
while(!pq.empty()) {
pair<int, int> p = pq.top();
pq.pop();
int v = p.second;
if(used[v]) continue;
used[v] = true;
for(int i=0; i<G[v].size(); i++) {
Edge e = G[v][i];
if(d[e.to] > d[v] + e.cost) {
d[e.to] = d[v] + e.cost;
pq.push(make_pair(d[e.to], e.to));
}
}
}
}
int main() {
int n, m, s, t;
cin >> n >> m >> s >> t;
for(int i=0; i<m; i++) {
int u, v, w;
cin >> u >> v >> w;
G[u].push_back(Edge(v, w));
}
dijkstra(s);
cout << d[t] << endl;
return 0;
}
```
其中,G数组为邻接表存图,d数组为距离数组,used数组表示是否已经确定了最短距离。dijkstra函数中,首先初始化d数组和used数组,将起点s入队,然后每次取出最小距离的点v,遍历其所有出边,更新到其它点的距离。最后输出t点的距离即可。
阅读全文