資料結構筆記:圖(待填坑)
- 各種圖定義
-
圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(VE),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。
- 頂點(Vertex):圖中的資料元素
-
若頂點vi到vj之間的邊沒有方向,則稱這條邊為無向邊(Edge),用無序偶對(vi,vj)來表示。
-
如果圖中任意兩個頂點之間的邊都是無向邊,則稱該圖為無向圖(Undirected graphs)。
- 若從頂點v到v的邊有方向,則稱這條邊為有向邊,也稱為弧(Arc)。用有序偶對<vi,vj>來表示,v1稱為弧尾(Tail),v2稱為弧頭(Head)。
- 如果圖中任意兩個頂點之間的邊都是有向邊,則稱該圖為有向圖(Directed graphs)
- 在無向圖中,如果任意兩個頂點之間都存在邊,則稱該圖為無向完全圖。
含有n個頂點的無向完全圖有nx(n-1)/2條邊。 - 在有向圖中,如果任意兩個頂點之間都存在方向互為相反的兩條弧,則稱該圖為有向完全圖。
含有n個頂點的有向完全圖有n×(n-1)條邊。 - 有很少條邊或弧的圖稱為稀疏圖,反之稱為稠密圖。(相對概念)
- 有些圖的邊或弧具有與它相關的數字,這種與圖的邊或弧相關的數叫做權(Weight)。這些權可以表示從一個頂點到另一個頂點的距離或耗費。
- 這種帶權的圖通常稱為網(Network)。
- 假設有兩個圖G=(V,{B})和G′= (V′,{E′}),如果V′⊆V且E′⊆E,則稱G為G的子圖(Subgraph)
-
圖的頂點與邊間關係
-
對於無向圖G=(V{E}),如果邊(v,v′)∈E,則稱頂點v和v互為鄰接點(Adjacent),即v和v′相鄰接。邊(v,v′)依附(incident)於頂點v和v′,或者說(v,v')與頂點v和v'相關聯。頂點v的度(Degree)是和v相關聯的邊的數目,記為TD (v)。
- 對於有向圖G=(V,{E}),如果弧<v,v′>∈E,則稱頂點v鄰接到頂點v′,頂點v′鄰接自頂點v。弧<v,v′>和頂點 v,v′相關聯。以頂點v為頭的弧的數目稱為v的入度(InDegree),記為ID(v);以v為尾的弧的數目稱為v的出度(OutDegree)
- 無向圖G=(V,{E})中從頂點v到頂點v′的路徑(Path)是一個頂點序列(v=vi,0,vi,1,…,vi,m=v′),其中(vi,j-1,vi,j)∈E,1≤j≤m。
-
路徑的長度是路徑上的邊或弧的數目。
-
第一個頂點到最後一個頂點相同的路徑稱為迴路或環(Cycle)。
-
序列中頂點不重複出現的路徑稱為簡單路徑。
-
除了第一個頂點和最後一個頂點之外,其餘頂點不重複出現的迴路,稱為簡單迴路或簡單環。
-
-
連通圖相關術語
-
在無向圖G中,如果從頂點v到頂點v′有路徑,則稱v和v′是連通的。如果對於圖中任意兩個頂點 vi、vj∈E, vi和vj都是連通的,則稱G是連通圖(Connected Graph)。
-
無向圖中的極大連通子圖稱為連通分量。
注意連通分量的概念,它強調:
0.子圖要是連通的
1.子圖要是連通的
2.連通子圖含有極大頂點數
3.具有極大頂點數的連通子圖包含依附於這些頂點的所有邊 - 在有向圖G中,如果對於每一對vi、vj∈V、vi≠vj,從vi到vj和從vj到vi都存在路徑,則稱G是強連通圖。有向圖中的極大強連通子圖稱做有向圖的強連通分量。
- 一個連通圖的生成樹是一個極小的連通子圖,它含有圖中全部的n個頂點,但只有足以構成一棵樹的n-1條邊。
- 如果一個有向圖恰有一個頂點的入度為0,其餘頂點的入度均為1,則是一棵有向樹。
-
一個有向圖的生成森林由若干棵有向樹組成,含有圖中全部頂點,但只有足以構成若干棵不相交的有向樹的弧。如圖1是一棵有向圖。去掉一些弧後,它可以分解為兩棵有向樹,如圖2和圖3,這兩棵就是圖1有向圖的生成森林。
-
- 圖的抽象資料型別
ADT 圖(Graph) Data 頂點的有窮非空集合和邊的集合。 Operation CreateGraph(*G, V, VR): 按照頂點集V和邊弧集VR的定義構造圖G。 DestroyGraph(*G): 圖G存在則銷燬。 LocateVex(G, u): 若圖G中存在頂點u,則返回圖中的位置。 GetVex(G, v): 返回圖G中頂點v的值。 PutVex(G, v, value): 將圖G中頂點v賦值value。 FirstAdjVex(G, *v): 返回頂點v的一個鄰接頂點,若頂點在G中無鄰接頂點返回空。 NextAdjVex(G, V, *w): 返回頂點v相對於頂點w的下一個鄰接頂點,若w是v的最後一個鄰接點則返回“空”。 InsertVex(*G, v): 在圖G中增添新頂點v。 DeleteVex(*G, v): 刪除圖G中頂點v及其相關的弧。 InsertArc(*G, v, w): 在圖G中增添弧<v, w>,若G是無向圖,還需要增添對稱弧<w, v>。 DFSTraverse(G): 對圖G中進行深度優先遍歷,在遍歷過程中對每個頂點呼叫。 BFSTraverse(G): 對圖G中進行廣度優先遍歷,在遍歷過程中對每個頂點呼叫。 endADT
- 圖的儲存結構
- 鄰接矩陣(Adjacency Matrix)
用兩個陣列來表示圖。一個一維陣列儲存圖中頂點資訊,一個二維陣列(稱為鄰接矩陣)儲存圖中的邊或弧的資訊。
設圖G有n個頂點,則鄰接矩陣是一個n×n的方陣,定義為:
一個無向圖及其對應的鄰接矩陣:
一個無向圖及其對應的鄰接矩陣:
設圖G是網圖,有n個頂點,則鄰接矩陣是一個n×n的方陣,定義為:
一個有向網圖及其對應的鄰接矩陣:
- 鄰接矩陣(Adjacency Matrix)