鏈式前向星初探

2021-08-03 01:57:14 字數 819 閱讀 2571

參自:

本質:用陣列來模擬鍊錶,實現圖的鄰接表儲存。兼具鄰接矩陣的實現複雜度與鄰接表的空間複雜度。(應該是比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 ...