鏈式前向星:
適合點多、邊少的情況
不適用於大量遍歷出邊的題目(因為cache miss)
鄰接表:
如果用鄰接表來實現的話,一般就用vector嘛,我們都知道vector都是自動擴容的,在空間滿了以後,就自動申請多一倍空間。
對於這樣一張有向圖:
輸入邊的順序如下:
1 2
2 3
3 4
1 3
4 1
1 5
4 5對於鄰接表來說是這樣的:
1 -> 2 -> 3 -> 5
2 -> 3
3 -> 4
4 -> 1 -> 5
5 ->^
對於鏈式前向星來說是這樣的:
edge[0].to = 2; edge[0].next = -1; head[1] = 0;
edge[1].to = 3; edge[1].next = -1; head[2] = 1;
edge[2].to = 4; edge[2],next = -1; head[3] = 2;
edge[3].to = 3; edge[3].next = 0; head[1] = 3;
edge[4].to = 1; edge[4].next = -1; head[4] = 4;
edge[5].to = 5; edge[5].next = 3; head[1] = 5;
edge[6].to = 5; edge[6].next = 4; head[4] = 6;
鄰接表是用鍊錶實現的,可以動態的增加邊,
而鏈式前向星是用結構體陣列實現的,是靜態的,需要一開始知道資料範圍,開好陣列大小。
相比之下,鄰接表靈活,鏈式前向星好寫。
鄰接表之鏈式前向星
鏈式前向星比vector鄰接表在記憶體效能和時間效能上更好。鏈式前向星用法詳見以下模板 includeusing namespace std const int maxn 1e3 10 最大點數 const int maxm 1e6 10 最大邊數 struct nodeedge maxm 邊集,t...
鏈式前向星 鄰接表 頭插法
通過我的理解我覺得鏈式前向星就是一種用鄰接表存圖的方式,我們知道資料結構中向鄰接表中插入元素有兩種方式尾插法和頭插法.如果我們用stl中vector模擬鄰接表的話,當我們插入元素的時候,很顯然它是用尾插法插入的元素.今天我就來說一下用頭插法來實現插入,也就是上面所說的鏈式前向星.使用陣列的方式來實現...
前向星和鏈式前向星
我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...