圖的簡介
圖(Graph)結構是一種非線性的數據結構,圖在實際生活中有很多例子,比如交通運輸網,地鐵網絡,社交網絡,計算機中的狀態執行(自動機)等等都可以抽象成圖結構。圖結構比樹結構復雜的非線性結構。
圖結構構成
1.頂點(vertex):圖中的數據元素,如圖一。
2.邊(edge):圖中連接這些頂點的線,如圖一。
圖一
所有的頂點構成一個頂點集合,所有的邊構成邊的集合,一個完整的圖結構就是由頂點集合和邊集合組成。圖結構在數學上記為以下形式:
G=(V,E) 或者 G=(V(G),E(G))
其中 V(G)表示圖結構所有頂點的集合,頂點可以用不同的數字或者字母來表示。E(G)是圖結構中所有邊的集合,每條邊由所連接的兩個頂點來表示。
圖結構中頂點集合V(G)不能為空,必須包含一個頂點,而圖結構邊集合可以為空,表示沒有邊。
圖的基本概念
1.無向圖(undirected graph)
如果一個圖結構中,所有的邊都沒有方向性,那么這種圖便稱為無向圖。典型的無向圖,如圖二所示。由於無向圖中的邊沒有方向性,這樣我們在表示邊的時候對兩個頂點的順序沒有要求。例如頂點VI和頂點V5之間的邊,可以表示為(V2, V6),也可以表示為(V6,V2)。
圖二 無向圖
對於圖二無向圖,對應的頂點集合和邊集合如下:
V(G)= {V1,V2,V3,V4,V5,V6}
E(G)= {(V1,V2),(V1,V3),(V2,V6),(V2,V5),(V2,V4),(V4,V3),(V3,V5),(V5,V6)}
2.有向圖(directed graph)
一個圖結構中,邊是有方向性的,那么這種圖就稱為有向圖,如圖三所示。由於圖的邊有方向性,我們在表示邊的時候對兩個頂點的順序就有要求。我們采用尖括號表示有向邊,例如<V2,V6>表示從頂點V2到頂點V6,而<V6,V2>表示頂點V6到頂點V2。
圖三 有向圖
對於圖三有向圖,對應的頂點集合和邊集合如下:
V(G)= {V1,V2,V3,V4,V5,V6}
E(G)= {<V2,V1>,<V3,V1>,<V4,V3>,<V4,V2>,<V3,V5>,<V5,V3>,<V2,V5>,<V6,V5>,<V2,V6>,<V6,V2>}
注意:
無向圖也可以理解成一個特殊的有向圖,就是邊互相指向對方節點,A指向B,B又指向A。
3.混合圖(mixed graph)
一個圖結構中,邊同時有的是有方向性有的是無方向型的圖。
在生活中混合圖這種情況比較常見,比如城市道路中有些道路是單向通行,有的是雙向通行。
4.頂點的度
連接頂點的邊的數量稱為該頂點的度。頂點的度在有向圖和無向圖中具有不同的表示。對於無向圖,一個頂點V的度比較簡單,其是連接該頂點的邊的數量,記為D(V)。 例如,圖二所示的無向圖中,頂點V5的度為3。而V6的度為2。
對於有向圖要稍復雜些,根據連接頂點V的邊的方向性,一個頂點的度有入度和出度之分。
- 入度是以該頂點為端點的入邊數量, 記為ID(V)。
- 出度是以該頂點為端點的出邊數量, 記為OD(V)。
這樣,有向圖中,一個頂點V的總度便是入度和出度之和,即D(V) = ID(V) + OD(V)。例如,圖三所示的有向圖中,頂點V5的入度為3,出度為1,因此,頂點V5的總度為4。
5.鄰接頂點
鄰接頂點是指圖結構中一條邊的兩個頂點。 鄰接頂點在有向圖和無向圖中具有不同的表示。對於無向圖,鄰接頂點比較簡單。例如,在圖二所示的無向圖中,頂點V2和頂點V6互為鄰接頂點,頂點V2和頂點V5互為鄰接頂點等。
對於有向圖要稍復雜些,根據連接頂點V的邊的方向性,兩個頂點分別稱為起始頂點(起點或始點)和結束頂點(終點)。有向圖的鄰接頂點分為兩類:
-
入邊鄰接頂點:連接該頂點的邊中的起始頂點。例如,對於組成<V2,V6>這條邊的兩個頂點,V2是V6的入邊鄰接頂點。
-
出邊鄰接頂點:連接該頂點的邊中的結束頂點。例如,對於組成<V2,V6>這條邊的兩個頂點,V6是V2的出邊鄰接頂點。
6.無向完全圖
如果在一個無向圖中, 每兩個頂點之間都存在條邊,那么這種圖結構稱為無向完全圖。典型的無向完全圖,如圖四所示。
圖四 無向完全圖
理論上可以證明,對於一個包含M個頂點的無向完全圖,其總邊數為M(M-1)/2。比如圖四總邊數就是5(5-1)/ 2 = 10。
7.有向完全圖
如果在一個有向圖中,每兩個頂點之間都存在方向相反的兩條邊,那么這種圖結構稱為有向完全圖。典型的有向完全圖,如圖五所示。
圖五 有向完全圖
理論上可以證明,對於一個包含N的頂點的有向完全圖,其總的邊數為N(N-1)。這是無向完全圖的兩倍,這個也很好理解,因為每兩個頂點之間需要兩條邊。
8.有向無環圖(DAG圖)
如果一個有向圖無法從某個頂點出發經過若干條邊回到該點,則這個圖是一個有向無環圖。
有向無環圖可以利用在區塊鏈技術中。
9.無權圖和有權圖
這里的權可以理解成一個數值,就是說節點與節點之間這個邊是否有一個數值與它對應,對於無權圖來說這個邊不需要具體的值。對於有權圖節點與節點之間的關系可能需要某個值來表示,比如這個數值能代表兩個頂點間的距離,或者從一個頂點到另一個頂點的時間,所以這時候這個邊的值就是代表着兩個節點之間的關系,這種圖被稱為有權圖;
10.圖的連通性
圖的每個節點不一定每個節點都會被邊連接起來,所以這就涉及到圖的連通性,如下圖:
可以發現上面這個圖不是完全連通的。
11.簡單圖 ( Simple Graph)
對於節點與節點之間存在兩種邊,這兩種邊相對比較特殊
1.自環邊(self-loop):節點自身的邊,自己指向自己。
2.平行邊(parallel-edges):兩個節點之間存在多個邊相連接。
這兩種邊都是有意義的,比如從A城市到B城市可能不僅僅有一條路,比如有三條路,這樣平行邊就可以用到這種情況。不過這兩種邊在算法設計上會加大實現的難度。而簡單圖就是不考慮這兩種邊。