參自:
本質:用陣列來模擬鍊錶,實現圖的鄰接表儲存。兼具鄰接矩陣的實現複雜度與鄰接表的空間複雜度。(應該是比vector 鄰接表要快一些)
不同於前向星需要乙個排序操作,鏈式前向星節省了額外的排序複雜度,它並不需要把起點相同的邊通過排序放在相鄰空間,而是通過引入乙個head陣列將這些分散儲存的同一起點的邊鏈在一起,從而實現高效遍歷
儲存結構:
struct edge;
edge[i].to表示第i條邊的終點,edge[i].w為邊權值,edge[i].next表示與第i條邊同起點的下一條邊的儲存位置.
陣列head用來表示以i為起點的第一條邊儲存的位置,而實際輸入時儲存的是最後輸入的以i為起點的邊的編號。因為要隨著輸入進行更新嘛
head陣列一般初始化為-1。因此如果以u為起點的邊是第一次輸入,其edge[cnt].next==-1 ,遍歷以u為起點的邊時從最後輸入的那條邊開始遍歷,直到遇到head[u]==-1,表示這是以u為起點的頭一條輸入的邊,即最後一條需要遍歷的邊。
加邊函式實現如下:
void add(int u,int v,int w)
遍歷函式實現如下:
若需遍歷以u為起點的所有邊,可以
for(int i=head[u];~i;i=edge[i].next)//-1的補碼為全1,按位取反為全零 遍歷終止
故遍歷所有邊即:
for(int u=1;u<=n;++u){
for(int i=head[u];~i;i=edge[i].next){
cout<
前向星和鏈式前向星
我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...
前向星和鏈式前向星
前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...
前向星和鏈式前向星
1 前向星 前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一 2 ...