優先佇列:是一種特殊的佇列。這種佇列會自動的將佇列裡面的元素進行排序,這種排序是可定義的。
這二者如何結合呢?
我們都知道。迪傑斯特拉演算法每一步都需要找屬於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一開始就是最近的,那麼...