陣列模擬鄰接表儲存

2022-02-28 07:35:41 字數 1978 閱讀 7708

鄰接矩陣看上去是個不錯的選擇,首先是容易理解,第二是索引和編排都很舒服但是我們也發現,對於邊數相對頂點較少的圖,這種結構無疑是存在對儲存空間的極大浪費。

因此我們可以考慮另外一種儲存結構方式,例如把陣列與鍊錶結合一起來儲存,這種方式在圖結構也適用,我們稱為鄰接表(adjacencylist)

每乙個單鏈表設乙個表頭結點。

i個單鏈表表示依附於頂點vi的邊(對有向圖是以頂點vi為頭或尾的弧)

圖的鄰接表儲存法,又叫鏈式儲存法。本來是要用鍊錶實現的,但大多數情況下只要用陣列模擬即可。

l鄰接表(有向圖)

l鄰接表的處理方法是這樣:

l圖中頂點用乙個一維陣列儲存,當然,頂點也可以用單鏈表來儲存,不過陣列可以較容易地讀取頂點資訊,更加方便。

l圖中每個頂點vi的所有鄰接點構成乙個線性表,由於鄰接點的個數不確定,所以我們選擇用單鏈表來儲存。

但也有時為了便於確定頂點的入度或以頂點為弧頭的弧,我們可以建立乙個有向圖的逆鄰接表:

此時我們很容易就可以算出某個頂點的入度或出度是多少,判斷兩頂點是否存在弧也很容易實現。

對於帶權值的網圖,可以在邊表結點定義中再增加乙個資料域來儲存權值即可:

**實現:

1 #include2 #include3

using

namespace

std;

4const

int e=5;//

e為最大邊數

5const

int n=3;//

n為最大定點數

6struct

edge edge[e];

9int head[n];//

表頭;10

int num;//

記憶體指標;

11void

chushi()

1217

void add_edge(int b,int e,int

w)18

25int

main()

2635 cout<<1;36

for(int i=head[1];i!=-1;i=edge[i].next) //

遍歷從點1開始的所有邊

3740

return0;

41 }

陣列模擬鄰接表

圖的鄰接矩陣儲存法,它的空間和時間複雜度都是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 然後看題意...

ACM 用陣列模擬鄰接表

為了學最短路而補。用圖的鄰接矩陣儲存法,它的空間和時間複雜度都是n2,現在我來介紹另外一種儲存圖的方法 鄰接表,這樣空間和時間複雜度就都是m。對於稀疏圖來說,m要遠遠小於n2。先上資料,如下。第一行兩個整數n m。n表示頂點個數 頂點編號為1 n m表示邊的條數。接下來m行表示,每行有3個數x y ...