天天看點

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

圖(graph)是一種非線性結構

圖的特點(多對多),頂點之間的關系是任意的,圖中任意兩個頂點之間都可能相關,頂點的前驅和後繼個數無限制。

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

圖:資料元素間存在多對多關系的資料結構,加上一組基本操作構成的抽象資料類型。

圖的基本術語

頂點:圖中的資料元素。

弧:若 <v, w>∈vr,則 <v, w> 表示從 v 到 w 的一條弧,且稱 v 為弧尾,稱 w 為弧頭,此時的圖稱為有向圖。 

g1 = (v1, a1)          v1 = {v1, v2, v3, v4}

a1 = {< v1, v2>, < v1, v3>, < v3, v4>, < v4, v1>} 

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

邊:若 <v, w>∈vr 必有<w, v>∈vr,則以無序對 (v, w) 代表這兩個有序對,表示 v 和 w 之間的一條邊,此時的圖稱為無向圖。 

g2 = (v2, e2)           v2 = {v1, v2, v3, v4, v5}

e2 = {(v1, v2), (v1, v4), (v2, v3), (v2, v5) , (v3, v4), (v3, v5)} 

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

無向圖中邊的取值範圍:0≤e≤n(n-1)/2。(用 n 表示圖中頂點數目,用 e 表示邊的數目。且不考慮頂點到其自身的邊。)

完全圖:有 n(n-1)/2 條邊的無向圖(即:每兩個頂點之間都存在着一條邊)稱為完全圖。

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

有向圖中弧的取值範圍:0≤e≤n(n-1)。(用 n 表示圖中頂點數目,用 e 表示弧的數目。且不考慮頂點到其自身的弧。)

有向完全圖:有 n (n - 1) 條弧的有向圖(即:每兩個頂點之間都存在着方向相反的兩條弧)稱為有向完全圖。

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

稀疏圖:含有很少條邊或弧的圖。

稠密圖:含有很多條邊或弧的接近完全圖的圖。

權:與圖的邊或弧相關的數,這些數可以表示從一個頂點到另一個頂點的距離或耗費。

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

網: 帶權的圖。

子圖:如果圖 g = (v, e) 和 g´= (v ´, e´),滿足:v ´包含于v 且 e´包含于 e,則稱 g´為g 的子圖。

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)
圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

鄰接點:若 (v, v´) 是一條邊,則稱頂點 v 和 v´互為鄰接點,或稱 v 和 v´相鄰接;稱邊 (v, v´) 依附于頂點 v和 v´,或稱 (v, v´) 與頂點 v 和 v´ 相關聯。若 <v, v´> 是一條弧,則稱頂點 v 鄰接到 v´,頂點v´鄰接自頂點 v。并稱弧 <v, v´> 與頂點 v 和 v´ 相關聯。

度:無向圖中頂點 v 的度是和 v相關聯的邊的數目,記為:td(v)。

入度:有向圖中以頂點 v 為頭的弧的數目稱為 v 的入度,記為:id(v)。 

出度:有向圖中以頂點 v 為尾的弧的數目稱為 v 的出度,記為:od(v)。

度:入度和出度之和,即:td(v) = id(v) + od(v)。

如果頂點 vi 的度為 td(vi),則一個有 n 個頂點 e 條邊(弧)的圖,滿足如下關系: 

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

路徑:從頂點 v 到 v´ 的路徑是一個頂點序列。對于有向圖,路徑也是有向的。 

路徑長度:路徑上邊或弧的數目。

回路(環):第一個頂點和最後一個頂點相同的路徑。

簡單路徑:序列中頂點不重複出現的路徑。 

連通:從頂點 v 到 v´ 有路徑,則說 v  和 v´ 是連通的。

連通圖:圖中任意兩個頂點都是連通的。

連通分量:無向圖的極大連通子圖(該子圖是 連通子圖,g中再加一個頂點就不連通,再減一條邊就不極大);任何連通圖的連通分量隻有一個,即其本身;非連通圖有多個連通分量(非連通圖的每一個連通部分)。

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

強連通圖: 任意兩個頂點都連通的有向圖。

強連通分量:有向圖的極大強連通子圖(該子圖是強連通子圖,圖中再加一個頂點就不連通,再減一條邊就不極大);任何強連通圖的強連通分量隻有一個,即其本身;非強連通圖有多個強連通分量。

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

連通圖的生成樹:包含無向圖g 所有頂點的的極小連通子圖(該子圖是g 的連通子圖,在該子圖中删除任何一條邊,子圖不再連通;加入一條邊,則子圖一定有環。 )一個圖可以有許多棵不同的生成樹。

所有生成樹具有以下共同特點: 

1、生成樹的頂點個數與圖的頂點個數相同;

2、生成樹是圖的極小連通子圖;

3、一個有 n 個頂點的連通圖的生成樹有 n-1 條邊;

4、生成樹中任意兩個頂點間的路徑是唯一的;

5、在生成樹中再加一條邊必然形成回路。

6、含 n 個頂點 n-1 條邊的圖不一定是生成樹。

(無向圖) 生成森林:由若幹棵生成樹組成,含有圖中全部頂點,但隻有足以構成若幹棵不相交的生成樹的邊。     

有向樹:如果一個有向圖恰有一個頂點的入度為 0 ,其餘頂點的入度均為 1 ,則是一棵有向樹。

有向圖的生成森林:由若幹棵有向樹組成,含有圖中全部頂點,但隻有足以構成若幹棵不相交的有向樹的弧。

圖的存儲結構

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

圖的存儲結構要儲存兩類資訊: 

1)頂點的資料

2)頂點間的關系

順序存儲:任意兩頂點都可能有聯系,不能用元素在存儲區中的實體位置來表示元素之間的關系。

多重連結清單:與樹類似,浪費存儲單元;操作不友善。

數組表示法(鄰接矩陣表示法) 

一個有 n 個頂點的圖,可用兩個數組存儲。其中一個一維數組存儲資料元素(頂點)的資訊,另一個二維數組(鄰接矩陣)存儲資料元素之間的關系(邊或弧)的資訊。

鄰接矩陣:設 g = (v, vr) 是具有 n 個頂點的圖,頂點的順序依次為 {v1, v2, …, vn},則 g  的鄰接矩陣是具有如下性質的 n 階方陣:

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

比如:

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

使用鄰接矩陣存儲

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

再比如

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

使用鄰接矩陣

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

特點:

1、無向圖的鄰接矩陣對稱,可壓縮存儲;有 n 個頂點的無向圖所需存儲空間為 n(n-1)/2。

2、有 n 個頂點的有向圖所需存儲空間為n²,用于稀疏圖時空間浪費嚴重。占用存儲空間隻與它的頂點數有關,與邊數無關;适用于邊稠密的圖;

3、無向圖中頂點 vi 的度 td(vi) 是鄰接矩陣中第 i 行 1 的個數。

4、有向圖中:頂點 vi 的出度是鄰接矩陣中第 i 行 1 的個數。 頂點 vi 的入度是鄰接矩陣中第 i 列 1 的個數。

網的鄰接矩陣可定義為:

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)
圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

使用鄰接矩陣表示

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

代碼如下:

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)
圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

鄰接表(類似于樹的孩子連結清單表示法) 

鄰接點域,存放與 vi 鄰接的頂點在表頭數組中的位置。

鍊域,訓示下一條邊或弧。

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

表頭結點之後的連結清單,表示的是該表頭的結點代表的圖的頂點的鄰接的頂點,其中資料域的數字代表的是表頭數組的下标,也就是頂點。

圖(網)的存儲結構(數組存儲表示即鄰接矩陣、鄰接表)

若無向圖中有 n 個頂點、e 條邊,則其鄰接表需 n 個頭結點和 2e 個表結點。适宜存儲稀疏圖。

無向圖中頂點 vi 的度為第 i 個單連結清單中的結點數。

建立無向鄰接表

思想:如何給存儲結構指派

1.建立頂點數組。讀入各頂點資料vextex,将link域賦null。

2.建立各頂點的鄰接表。

    讀入頂點對<i,j>,  生成兩個節點,分别插入頂點j,i的鄰接表的頭部。直至處理完所有的邊。

時間複雜度o(n+e)

辛苦的勞動,轉載請注明出處,謝謝……

http://www.cnblogs.com/kubixuesheng/p/4399408.html

繼續閱讀