Data Structures in C++:圖


相關定義

圖、頂點、鄰接關係(邊)

圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成, 通常表示爲: G(V,E)G(V,E) 其中,G表示一個圖,V是圖G中 頂點 vertex 的集合,E是圖G中 的集合。

  • 線性結構中,元素僅有線性關係,每個元素只有一個直接前驅和直接後繼,邏輯關係爲“前驅-後繼”;
  • 樹形結構中,數據元素(結點)之間有着明顯的層次關係,每層上的元素可能和下一層中多個元素相關,但只能和上一層中一個元素相關。邏輯關係爲“parent-child”;
  • 圖形結構中,數據元素(頂點)之間具有任意關係,圖中任意兩個數據元素之間都可能相關,邏輯關係稱爲 鄰接 adjacent

有向圖、無向圖、網

在這裏插入圖片描述

  • 無向邊 undirected:若頂點Vi到Vj之間的邊沒有方向,則稱這條邊爲無向邊,用無序偶對 (Vi,Vj)(V_i,V_j) 來表示,則左側無向圖表示爲:G=(V1,E1)G= (V_1,E_1),其中頂點的集合V1={ABCD}V_1=\{A,B,C,D\}; 邊的集合 E1={(A,B),(B,C),(C,D),(D,A),(A,C)}E_1=\{(A,B) ,(B,C),(C,D), (D,A) , (A,C)\}

  • 有向邊 directed:若從頂點ViV_iVjV_j的邊有方向,則稱這條邊爲有向邊,也稱爲 , 用有序偶 <Vi,Vj><V_i,V_j> 來表示, ViV_i稱爲弧尾,VjV_j稱爲弧頭,即ViV_i指向VjV_j。 如果圖中任意兩個頂點之間的邊都是有向邊,則稱該圖爲有向圖。 右側有向圖表示爲:G=(V2,E2)G= (V_2, E_2),其中頂點集合V2={A,B,C,D}V_2=\{A,B,C,D\}; 弧集合 E2={<A,D>,<B,A>,<C,A>,<B,C>}E2=\{<A,D>, <B,A>, <C,A>, <B,C>\}

  • 有權圖:每條邊上帶有 權weight 的圖,也分有向和無向。

  • 完全無向圖:該無向圖中任意兩個頂點之間都存在邊,n個頂點共含有 Cn2=n×(n1)2C_n^2 = \frac{n×(n-1)}{2}條邊;

  • 完全有向圖:該有向圖中任意兩個頂點之間都存在方向相反的兩條弧,n個頂點共含有 2×Cn2=n×(n1)2×C_n^2 =n×(n-1)條邊;


圖的抽象數據類型



圖的存儲結構

鄰接矩陣

在這裏插入圖片描述

鄰接表

在這裏插入圖片描述

鄰接矩陣和鄰接表的比較

以無向圖G(V,E)G(V, E)爲例,含有n個頂點e條邊:

  • 空間複雜度:鄰接矩陣 O(n2)O(n^2),鄰接表 O(n+e)O(n+e)
  • 訪問鄰接點的平均時間複雜度:鄰接矩陣 O(n)O(n),鄰接表 O(e/n)O(e/n)
  • 唯一性:頂點編號確定後,鄰接矩陣是唯一的,鄰接表不是,取決於創建圖時的輸入次序和頂點在邊表的插入算法。

圖的遍歷方式

從圖中某一頂點出發訪遍圖中其餘頂點,且使每一個頂點僅被訪問一次,這一過程就叫做圖的遍歷。

在這裏插入圖片描述
深度優先搜索 DFS
從圖中某個頂點v出發,訪問此頂點,然後從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v 有路徑相通的頂點都被訪問到。

廣度優先搜索 BFS

廣度優先遍歷就類似於樹的層序遍歷。


圖的代碼實現


圖的應用

最小生成樹:用最短的路徑連接所有頂點

求解兩點之間的最短路徑

拓撲排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章