Dijkstra最小步长最短路径
Dijkstra shortest path with minimum steps
我需要实现一个程序,给定一个有向图,在弧线处具有正成本,打印从x到y的最小成本以及从x到y的所有路径的最小步数。我写了一个程序来做这个,但有时它选择的路径不是最小步数。下面是我的代码:
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
typedef pair<int, int> Warc;
typedef vector<vector<Warc>> Wgraph;
int dijkstra(const Wgraph& g, int x, int y, vector<int>& p) {
int n = g.size();
vector<int> d(n, INT_MAX); //costs
p = vector<int>(n, -1); //parent of each vertice
d[x] =0;
vector<bool> S(n, false);
priority_queue<Warc, vector<Warc>, greater<Warc>> Q;
Q.push(Warc(0, x));
while(not Q.empty()) {
int u = Q.top().second;
Q.pop();
if(u == y) return d[u];
if(not S[u]) {
S[u] = true;
for(Warc a : g[u]) {
int v = a.second;
int c = a.first;
if(d[v] > d[u] + c) {
d[v] = d[u] + c;
p[v] = u;
Q.push(Warc(d[v], v));
}
}
}
}
return -1;
}
int main() {
int n; //# of vertices
while(cin >> n) {
int m; //# of arcs
cin >> m;
Wgraph g(n);
for(int i = 0; i<m; ++i) {
int u, v;
int c;
cin >> u >> v >> c; // arc: u->v with cost C
g[u].push_back(make_pair(c, v));
}
int x, y;
cin >> x >> y; //origin and end
vector<int> p; //p[i]= parent of vertice i
int path = dijkstra(g, x, y, p);
if(path == -1) cout << "no path from " << x << " to " << y << endl;
else {
int s = 0;
int i = y;
while(i != x) {
++s;
i = p[i];
}
cout << "cost " << path-s << ", " << s << " step(s)" << endl;
}
}
}
谢谢。
问题是您只考虑优先级队列中的距离。因此,将使用随机的最后一条边来完成路径,但只考虑其中一条边。你可以创建一个更高级的距离,除了考虑距离之外,还考虑路径的长度:主要权重将是距离,但对于相同的距离,你会认为来自较短路径的边更短。
请注意,你的算法有错误的复杂性:它的复杂性O(m log m)
而不是O(n log n)
(n
是节点的数量和m
是边的数量),因为你存储在你的优先队列边而不是节点。Dijstra的算法只有在存储节点并根据需要调整其在优先级队列中的位置时才有效——std::priority_queue<T>
不支持这种操作。
相关文章:
- 内存效率表示最短路径的方法?
- 用于查找网格中最短路径的算法
- 查找最短路径算法
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 使用优先级队列查找所有与 Dijkstra 相同的最短路径
- 使 c++11 Dijkstra 实现返回最短路径
- Dijkstra 最短路径算法性能 std::p riority_queue VS std::set.
- 在 stl 中使用向量和对的最有效实现 Dijkstra 最短路径C++
- 具有恒定权重的 Dijkstra 最短路径算法
- 使用 Dijkstra 算法计算两个节点之间的最短路径
- 最短路径的dijkstra算法的时间复杂度是否取决于所使用的数据结构?
- Boost dijkstra shortest_path-如何获得最短路径而不仅仅是距离
- 提升BGL Dijkstra最短路径
- 使用具有指定最大距离的 Boost Dijkstra 查找最短路径
- Boost:: Dijkstra 最短路径,如何从路径迭代器获取顶点索引
- 使用 Dijkstra 和最小堆 c++ 查找节点之间的最短路径
- Dijkstra最短路径与VertexList = ListS在boost图
- 具有捆绑性质的BGL-Dijkstra最短路径
- 我在 OpenMP 中实现 Dijkstra 最短路径算法时可能存在的范围问题?
- Dijkstra最小步长最短路径