1. 程式人生 > >資料結構之圖(圖的簡介)

資料結構之圖(圖的簡介)

圖的定義:

  一個圖G = (V,E)由頂點(vertex)集 V 合邊(edge)集 E 組成。每條邊(v,w)就是一個點對,其中v,w ∈ V。有時也把邊稱作弧。如果點對是有序的,那麼圖就叫做有向圖。頂點 v 和 w 領接邊 (v,w) ∈ E。在一個具有邊(v,w)從而具有邊(w,v)的無向圖,w和v鄰接那v和w也鄰接。

圖的基本術語:

  1. 階(Order):圖G中頂集V的大小稱作圖G的階。
  2. 子圖(Sub-Graph):G'稱作圖G=(V,E)的子圖,當圖G'=(V',E'),且V‘包含於V,E’包含於E。每個圖都是本身的子圖。
  3. 生成子圖(Spanning Sub-Graph):指滿足條件V(G') = V(G)的G的子圖G。
  4. 度(Degree):一個頂點的度是指與該邊相關聯的邊的條數,頂點v的度記作d(v)。
  5. 入度(In-degree)和出度(Out-degree):對於有向圖來說,一個頂點的度可細分為入度和出度。一個頂點的入度是指與其關聯的各邊之中,以其為終點的邊數;出度則是相對的概念,指以該頂點為起點的邊數。
  6. 自環(Loop):若一條邊的兩個頂點為同一頂點,則此邊稱作自環。
  7. 路徑(Path):從u到v的一條路徑是指一個序列v0,e1,v1,e2,v2,...ek,vk,其中ei的頂點為vi及vi - 1,k稱作路徑的長度。如果它的起止頂點相同,該路徑是“閉”的,反之,則稱為“開”的。一條路徑稱為一簡單路徑(simple path),如果路徑中除起始與終止頂點可以重合外,所有頂點兩兩不等
  8. 連通圖:如果在一個無向圖中從每一個頂點到每個其他頂點都存在一條路徑,則稱該無向圖是聯通的,具有這樣的有向圖成為強連通圖。

圖的儲存:

  我們可以用兩種方法來儲存圖的,一種是鄰接連結串列一種是鄰接矩陣。但是有向圖和無向圖又有所不同,如下兩幅圖:

  

  由上面兩幅圖我們可以看出無論是有向圖還是無向圖,鄰接矩陣表示法所需要的儲存空間都是 O(V^2)(v是頂點),而鄰接連結串列是O(V+E)(V是頂點,E是邊)。當在圖頂點的個數非常多,而邊又很少的時候,採用鄰接矩陣會浪費大量的儲存空間,此時用鄰接連結串列表示法比較好。當圖的規模比較小的時候我們可以採用鄰接矩陣表示法來儲存,因為鄰接矩陣有很多優點,比如可以再O(1)時間內判斷兩條邊是否有邊。

圖的基本操作:

(1)建立一個圖結構 CreateGraph(G) (2)檢索給定頂點 LocateVex(G,elem) (3)獲取圖中某個頂點 GetVex(G,v) (4)為圖中頂點賦值 PutVex(G,v,value) (5)返回第一個鄰接點 FirstAdjVex(G,v) (6)返回下一個鄰接點 NextAdjVex(G,v,w) (7)插入一個頂點 InsertVex(G,v) (8)刪除一個頂點 DeleteVex(G,v) (9)插入一條邊 InsertEdge(G,v,w) (10)刪除一條邊 DeleteEdge(G,v,w) (11)遍歷圖 Traverse(G,v)

圖的高階演算法:

  1.最小生成樹(Prim和kruskal演算法)

  2.單元路徑最短(Dijkstra演算法)

  3.所有點對的最短路徑(Floyd-Warshall演算法)