前向星和鏈式前向星

2022-03-04 21:33:02 字數 1146 閱讀 6879

1、前向星

前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一-2-4展示了圖一-2-1的前向星表示法。

2、鏈式前向星(就是陣列模擬鍊錶)

鏈式前向星和鄰接表類似,也是鏈式結構和線性結構的結合,每個結點i都有乙個鍊錶,鍊錶的所有資料是從i出發的所有邊的集合(對比鄰接表存的是頂點集合),邊的表示為乙個四元組(u, v, w, next),其中(u, v)代表該條邊的有向頂點對,w代表邊上的權值,next指向下一條邊。

具體的,我們需要乙個邊的結構體陣列 edge[maxm],maxm表示邊的總數,所有邊都儲存在這個結構體陣列中,並且用head[i]來指向 i 結點的第一條邊。

邊的結構體宣告如下:

struct edge

edge(int _u, int _v, int _w, int _next) 

}edge[maxm];

初始化所有的head[i] = inf,當前邊總數 edgecount = 0

每讀入一條邊,呼叫addedge(u, v, w),具體函式的實現如下:

void addedge(int u, int v, int w)

這個函式的含義是每加入一條邊(u, v),就在原有的鍊錶結構的首部插入這條邊,使得每次插入的時間複雜度為o(1),所以鍊錶的邊的順序和讀入順序正好是逆序的。這種結構在無論是稠密的還是稀疏的圖上都有非常好的表現,空間上沒有浪費,時間上也是最小開銷。

呼叫的時候只要通過head[i]就能訪問到由 i 出發的第一條邊的編號,通過編號到edge陣列進行索引可以得到邊的具體資訊,然後根據這條邊的next域可以得到第二條邊的編號,以此類推,直到next域為inf(這裡的inf即head陣列初始化的那個值,一般取-1即可)。

前向星和鏈式前向星

我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...

前向星和鏈式前向星

前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...

前向星和鏈式前向星(詳解 模板)

前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了。用len i 來記錄所有以i為起點的邊在陣列中的儲存長度。用head i 記錄以i為邊集在陣列中的第乙個儲...