使得最短路演算法時間複雜度再次加快了乙個檔次變成了n
∗log2
nn*\log_2 n
n∗log2n
,讓人更加頭禿
來說原理的話我建議可以講一下迪傑斯特拉的演算法思想,利用貪心,每一次走距離當前點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...