內容總結自紫書(第二版)p360,dijkstra演算法的優化
巧妙的借助編號將鄰接資訊儲存在first與next兩個陣列中,下面簡單的介紹基本的應用方式:
測試資料講解:
107//表示結點n個和以下m個路徑39
8//u,v,w分別表示路徑起點、路徑終點、路徑長度37
6368
2545
3468
7105
組織鄰接表的**:
1const
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 0123456
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
在讀取上述列表時,應當使用如下的迴圈:
1for(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 每乙個單鏈...