我相信下面的Dijkstra算法的实现适用于所有负权重但没有负和的循环。Dijkstra的负权重算法(但没有负循环)
但是,我看到很多人说Dijkstra对于负权重图不起作用,所以我相信算法是错误的或者执行时间比Dijkstra算法慢得多。
我只是想知道如果有人可以请帮我这个代码?非常感谢您的帮助!
(编辑:这个问题是别人不一样,因为我也想知道如果该算法的执行时间远远大于Dijkstra算法较长时间,因为节点可以多次访问)
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > G[N];
int cost[N];
int main() {
queue<int> q;
q.push(0);
cost[0] = 0;
for(int i=1; i<N; i++) {
cost[i] = infinity;
}
while(! q.empty()) {
int v = q.front();
q.pop();
for(int i=0; i<G[v].size(); i++) {
if(cost[G[v][i].first] > cost[v] + G[v][i].second) {
cost[G[v][i].first] = cost[v] + G[v][i].second;
q.push(G[v][i].first);
}
}
}
}
可能使用[使用Dijkstra算法的负权重](https://stackoverflow.com/questions/6799172/negative-weights-using-dijkstras-algorithm) –
可能,但在第一个答案的图中,此算法给出正确的重量(-200)。此外,我想知道如果可能这种算法,因为它多次访问每个节点,执行所需的时间比Dijkstra的多得多。 – user8384788
这是正确的,但在最坏的情况下它是指数级的。不过,我不记得如何建立这样一个图表的例子。 – kraskevich