我相信下面的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);
}
}
}
}
答案 0 :(得分:0)
即使是正确的(没有证明,但似乎是这样),您的算法会受到时间复杂性的影响。
具体来说,如果你看一个完整的DAG:
G = (V, E, w)
V = {1, ..., n}
E = { (i,j) | i < j }
w(u,v) = 2^ (v - u)
为了简化示例,我们假设算法以相反的顺序遍历边缘((u,v)
如果(u,x)
之前x < v
)(请注意,这只是为了简化,即使没有它你可以通过反转边的方向来建立一个反例。
请注意,每次打开算法时,算法都会重新打开每个边。这意味着您遍历此图中的所有路径,即节点数中的指数。