迪傑斯特拉 優先佇列優化

2021-08-14 13:28:41 字數 889 閱讀 5000

優先佇列:是一種特殊的佇列。這種佇列會自動的將佇列裡面的元素進行排序,這種排序是可定義的。

這二者如何結合呢?

我們都知道。迪傑斯特拉演算法每一步都需要找屬於vb集合中找乙個距離最小的點把他加入到va集合中,每一次都需要找。所以普通版的迪傑斯特拉演算法的時間複雜度是n*n。

因為每一步都需要找距離最小的點。我們這時候不妨考慮一下用優先佇列來優化這個找最小的過程。這樣時間複雜度就降到的n*logn。

下面上**

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define inf 0x3f3f3f

struct nodenod;

priority_queueqq; //定義優先佇列

bool operator < (node a ,node b)

int book[100]; //沒用到

int dis[100]; //答案陣列

int d[100][100]; //地圖

int v,e; //點的個數 和邊的個數

int main()

for(int i = 2;i <= v ; i ++)

dis[i] = inf;

dis[1] = 0;

nod.num = 1;

nod.val = 0;

qq.push(nod); //最開始的時候只有初始點1,所以把1加入優先佇列

while(!qq.empty())

}qq.pop();

} cout << dis[v] << endl;

}return 0;

}

迪傑斯特拉 優先佇列優化

今天還是搞一下這個迪傑斯特拉的優先佇列優化演算法吧。對於我們經常用的二維陣列來存圖的話,只要資料一大,就會超出記憶體,也可能tle,所以我們使用優化後的演算法。迪傑斯特拉堆優化 include include include include include includeconst int maxn...

優化迪傑斯特拉

1 include 2 include 3 include 4 define heap pair5 第乙個int存的是到起點的距離,第二個int存的是點的編號67 using namespace std 89 const int inf 2147483647 10 intn,m,t,cnt 11in...

迪傑斯特拉堆優化

使得最短路演算法時間複雜度再次加快了乙個檔次變成了n log 2 nn log 2 n n log2 n 讓人更加頭禿 來說原理的話我建議可以講一下迪傑斯特拉的演算法思想,利用貪心,每一次走距離當前點u uu最近的點v vv,那麼我們由原點到v vv一定會是最近的,因為u uu一開始就是最近的,那麼...