Dijkstra的负权重算法(但没有负循环)

时间:2017-08-18 15:27:48

标签: algorithm graph graph-theory shortest-path 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);
            }
        }
    }
}

1 个答案:

答案 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)(请注意,这只是为了简化,即使没有它你可以通过反转边的方向来建立一个反例。

请注意,每次打开算法时,算法都会重新打开每个边。这意味着您遍历此图中的所有路径,即节点数中的指数

相关问题