開始以為優先佇列優化的是最短路的時間複雜度,現在看來,更多的是優化空間複雜度
我們是先用那個把圖變成樹的資料結構來儲存圖中所有的邊
如果我們用鄰接表儲存邊的話,空間複雜度為n^2也就是說我們的陣列最大能開到5000*5000
現在我們儲存邊,那麼就可以在點較多而邊較少的情況下搞定了
下面附上注釋詳盡的**
題目:poj3159 這個題目其實是差分約束+dijk不懂差分約束的話可以看我的差分約束部落格
#include #include #include #include #include #define maxn 50000
#define inf 52100001
using namespace std;
struct edge
;//儲存邊的資料結構
struct node//優先佇列的資料結構
bool operator <(const node&r) const//變成小優先佇列的好方法
};//struct node
int head[maxn];
edge edge[150100];
int dijks(int en,int beg,int n);
int main()
//這個讀入就不說了具體解釋參見我的把圖化成樹的部落格
printf("%d\n",dijks(n,1,n));
}return 0;
}int dijks(int en,int beg,int n)}}
return dis[en];//返回結果即可
}
單源最短路徑 Dijkstra 優先佇列
1找到最短距離已經確認的頂點,從它出發更新相鄰頂點的最短距離 2此後不需要關心1中的 最短距離已經確認的頂點 堆中元素共有o v 個,更新和取出都有o e 次,每次更新或取出堆的維護時間是o lo 因此該演算法的時間複雜度為o elo 輸入兩個整數v,e,分別表示有向圖 無向圖就多新增一倍的邊 的的...
單源最短路模板(dij 優先佇列)
很多人也許學了spfa,覺得簡單方便,然而呢,spfa的複雜度是o 玄學 容易被出題人出資料卡,於是我們要學用優先佇列優化的dij。如果大家理解dij演算法的核心,那麼也會很容易理解為什麼優先佇列可以優化的。沒優化前的dij,我們每次鬆弛都要遍歷1 n 1 to n 1 n,來找到dis i dis...
分支限界法 優先佇列 單源最短路徑
演算法思想 分支限界法常以廣度優先或以最小耗費 最大效益 優先的方式搜尋問題的解空間樹。在分支限界法中,每乙個活結點只有一次機會成為擴充套件結點。活結點一旦成為擴充套件結點,就一次性產生其所有兒子結點。在這些兒子結點中,導致不可行解或導致非最優解的兒子結點被捨棄,其餘兒子結點被加入活結點表中。此後,...