我們在圖論題目的**編寫中一般會涉及到圖的儲存問題,通常的存圖的方法是鄰接矩陣和鄰接鍊錶,這兩者比較簡單,不做過多介紹。不過,這兩者乙個當面對稀疏圖時佔的記憶體過大,乙個因為是鍊錶操作又太慢,而且鍊錶的節點比矩陣的節點佔記憶體大,節點一多一樣很佔空間,這兩者都不是那種比較理想的存圖方式,而鏈式前向星綜合了他們的優點,很好的解決了這些問題。不得不說,思路是相當巧妙的。
鏈式前向星是一種特殊的邊集,從前向星改進而來,前向星中:每乙個點的邊按一定順序排列,而不同點的邊又先按點序號排序。用乙個head陣列表示該點的第一條邊,每條邊有乙個next指標指向下一條邊,當next為-1時表示此邊為該點的最後一條邊。
不過這樣就就涉及到了排序操作,會浪費時間,於是我們設計出了下面的方式:
void addedge(int
from, int end, int val)
head是即時更新的,這樣會導致head其實是每個點的最後一條邊,遍歷時順序是反著的,不過一般不影響圖論的各種演算法的結果。
完整**如下:
int cnt = 0;
int head[n];
struct edge
edge(int
to, int nxt, int
val): to(to), nxt(nxt), val(val) {}
};edge edge[n*n];
void addedge(int from, int end, int
val)
void init()
如果講的不清楚,請通過傳送門看這一篇部落格。
傳送門:
前向星和鏈式前向星
我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...
前向星和鏈式前向星
前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...
前向星和鏈式前向星
1 前向星 前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一 2 ...