Bellman-Ford演算法的佇列優化
阿新 • • 發佈:2019-02-02
上一篇文章對Bellman-Ford演算法的一種優化是每次僅對最短路程發生了變化的點的相鄰邊執行優化操作。這裡可以用佇列來維護這些點
輸入 5 7 1 2 2 1 5 10 2 3 3 2 5 7 3 4 4 4 5 5 5 3 6 結果是 0 2 5 9 9 5 3 6#include<iostream> using namespace std; int main() { int m, n; int u[8], v[8], w[8]; //陣列大小要比m的最大值大1 int first[6], next[8];//first比n大1,next比m大1 int dis[6] = { 0 }, book[6] = { 0 };//book記錄哪些頂點在佇列中 int que[101] = { 0 }, head = 1, tail = 1;//定義佇列 int inf = 99999999;//無窮大 cout << "輸入頂點數和邊的條數" << endl; cin >> n >> m; for (int i = 1; i <= n; i++) { dis[i] = inf;//初始化dis,是1號頂點到其餘個頂點的路程 book[i] = 0;//剛開始都不在佇列中 first[i] = -1;//-1表示剛開始暫時都沒有邊 } dis[1] = 0; for (int i = 1; i <= m; i++) { cin >> u[i] >> v[i] >> w[i];//讀入每條邊 next[i] = first[u[i]];//建立鄰接表 first[u[i]] = i; } que[tail] = 1;//1號頂點入隊 tail++; book[1] = 1;//標記 while (head < tail) { int k = first[que[head]];//當前需要處理的隊首頂點 while (k != -1) {//掃面次頂點的所有邊 if (dis[v[k]]>dis[u[k]] + w[k]) {//判斷是否鬆弛成功 dis[v[k]] = dis[u[k]] + w[k];//更新點1到v[k]的路程 if (book[v[k]] == 0) {//判斷v[k]是否在佇列中 que[tail] = v[k];//入隊 tail++; book[v[k]] = 1;//標記 } } k = next[k]; } book[que[head]] = 0;//出隊 head++; } for (int i = 1; i <= n; i++) {//輸出1號頂點到其餘個點的最短路徑 cout << dis[i] << " "; } return 0; }