迪傑斯特拉堆優化

2021-10-02 12:15:37 字數 973 閱讀 7574

使得最短路演算法時間複雜度再次加快了乙個檔次變成了n

∗log⁡2

nn*\log_2 n

n∗log2​n

,讓人更加頭禿

來說原理的話我建議可以講一下迪傑斯特拉的演算法思想,利用貪心,每一次走距離當前點u

uu最近的點v

vv,那麼我們由原點到v

vv一定會是最近的,因為u

uu一開始就是最近的,那麼dis

[u]+

min(

u→v)

≤dis

[u]+

!min

(u→v

)dis[u]+min(u\rightarrow v)\leq dis[u]+!min(u\rightarrow v)

dis[u]

+min

(u→v

)≤di

s[u]

+!mi

n(u→

v)根據這個我們可以知道我們只需

維護乙個最小堆來得到當前最小的dis

[u

]dis[u]

dis[u]

得到u

uu的位置,然後找到u

uu能到的點v

vv的最短路徑,得到dis

[v

]dis[v]

dis[v]

然後加入堆

迴圈1操作直到堆為空就好了。

#include#include#includeusing namespace std;

const int n = 2e+5;

struct eded[n];

int head[n],tot=0,dis[n],vis[n];

void add(int u,int v,int w)

priority_queue>q;

void dij_heap(int x)}}

}int main()

優化迪傑斯特拉

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...

迪傑斯特拉 優先佇列優化

優先佇列 是一種特殊的佇列。這種佇列會自動的將佇列裡面的元素進行排序,這種排序是可定義的。這二者如何結合呢?我們都知道。迪傑斯特拉演算法每一步都需要找屬於vb集合中找乙個距離最小的點把他加入到va集合中,每一次都需要找。所以普通版的迪傑斯特拉演算法的時間複雜度是n n。因為每一步都需要找距離最小的點...

迪傑斯特拉 優先佇列優化

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