我相信下面的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