圖的儲存常見的就兩種:鄰接表和鄰接矩陣。鏈式前向星是介於兩者之間的一種圖的儲存方式.
結構體存的是邊的資訊,u,v分別是邊的起始點,next指標指向的是前一次存入的邊的序號,如果前面沒有序號,則存入-1;
重點在於引入了乙個 head[ ] 陣列,利用 head[ ] 陣列抽象的構造出了鄰接表的一種儲存方式。
head[u]儲存的是最後一條存入u節點的邊的序號,之所以是最後一條邊是因為在構造的過程中不斷的將上一輪稱之為最後一條邊的序號轉移,新來邊的序號去覆蓋head[u]。這種方法有點像鄰接表的頭插法的構造方法。
因為 head[u] 已經拿到了最後一次存入u節點的邊的序號,因此可以訪問最後一條邊e[ head[u] ].u、e[ head[u] ].v ,然而e[ head[u] ].next儲存的是相同節點u的前一條邊,因此就可以很順利的訪問到相同節點所有邊。
鏈式前向星演算法也沒有很明顯的優勢,因此用的也不是很多。演算法的複雜度因為需要遍歷每個節點以及相鄰邊,因此是o(n+m)。
貼上**:
#include #include #include #include #define size 1000
using namespace std;
int n,m; //記錄n個節點,m條邊
int head[size]; //記錄當前節點所儲存的最後一條邊的序號
int ecnt; //記錄邊的個數
struct edge
e[size];
void make_edge(int from,int to) //有向圖構造邊
void make_undirected_edge(int from,int to) //無向圖構造邊
int main()
for(int u = 1 ; u <= n ; u ++) //遍歷以u節點為起點的所有邊}}
}
前向星和鏈式前向星
我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...
前向星和鏈式前向星
前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...
前向星和鏈式前向星
1 前向星 前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一 2 ...