陣列模擬鄰接表的基礎應用

2022-07-01 03:33:12 字數 1184 閱讀 3531

內容總結自紫書(第二版)p360,dijkstra演算法的優化

巧妙的借助編號將鄰接資訊儲存在first與next兩個陣列中,下面簡單的介紹基本的應用方式:

測試資料講解:

107//

表示結點n個和以下m個路徑39

8//u,v,w分別表示路徑起點、路徑終點、路徑長度37

6368

2545

3468

7105

組織鄰接表的**:

1

const

int maxn = 300;2

intn,m;

3int

first[maxn];

4int

u[maxn],v[maxn],w[maxn],next[maxn];56

intmain()717

return0;

18 }

first[u]儲存了結點u的「第一條邊」的編號e。由於模擬鍊錶採用的是向首部插入的方式,插入到模擬鍊錶的 最後乙個與u結點相連的邊 的編號e就儲存在first[u]裡。

next[e]表示編號為e的「下一條邊」的編號。由於某些原因,在每一次使用next陣列時都需要宣告,因為next可能因為內建關鍵字而重複。

first[i]與next[i]之間是沒有關係的。

我們將上面的資料經過上述的程式讀取並列印出來得到如下結果:

e 012

3456

789first:-163

2-14

5-1-1-1

next: -1

01-1-1-1-100

0u 33

3256

1000

v 976

5380

000w

8684

4750

00

在讀取上述列表時,應當使用如下的迴圈:

1

for(int c=first[3];c!=-1;c=::next[c])

2

上述**的意義是:對於結點u,從first陣列中取出其第一條邊的編號e1,則利用u,v,w陣列就能夠查詢出該路徑的相關資訊;然後將通過next[e1]中得到下一條邊的編號e2,直到next的最終值是結束標誌值(這裡是-1),即可完成所有與結點u相連的路徑的資訊查詢。

ok

陣列模擬鄰接表

圖的鄰接矩陣儲存法,它的空間和時間複雜度都是n2,現在來介紹另外一種儲存圖的方法 鄰接表,這樣空間和時間複雜度就都是m。對於稀疏圖來說,m要遠遠小於n2。先上資料,如下。4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行兩個整數n m。n表示頂點個數 頂點編號為1 n m表示...

用陣列模擬鄰接表

struct edge edge max 3 1 一定要邊的範圍 int head max 頭節點 void init 初始化資訊,1 插入邊void insert int u,int v,int64 len 遍歷 for int i head top i 1 i edge i next 然後看題意...

陣列模擬鄰接表儲存

鄰接矩陣看上去是個不錯的選擇,首先是容易理解,第二是索引和編排都很舒服但是我們也發現,對於邊數相對頂點較少的圖,這種結構無疑是存在對儲存空間的極大浪費。因此我們可以考慮另外一種儲存結構方式,例如把陣列與鍊錶結合一起來儲存,這種方式在圖結構也適用,我們稱為鄰接表 adjacencylist 每乙個單鏈...