1. 程式人生 > >第一章 圖的基本概念和圖的儲存

第一章 圖的基本概念和圖的儲存

   第一章      圖的基本概念和圖的儲存

 本篇是學習《圖論演算法理論,實現及應用》的學習筆記的第一章,概念部分

 1.1圖的基本概念

  1圖是由定點集合和頂點之間的二元關係集合(即邊的集合或者弧的集合)組成的資料結構,通常用G(VE)表示。

  頂點集合(Vertex Set):V(G)   邊的集合(Edge Set: E(G)

 V(G)中的元素稱為頂點(vertex),頂點的個數稱為圖的階(Order),用n表示

 E(G)中的元素稱為邊(Edge):,邊的個數稱為圖的邊數,用m表示。

u,v:表示無向邊uv相關聯

無向圖:圖中的所有邊沒有方向。E(u,v)

有向圖:圖中的所有邊都有方向。E<u,v> :

表示從頂點u指向頂點v的一條有向邊。

U是起點,v是終點

有向圖的邊(Edge)也稱為弧(Arc),有向圖也可以表示為D(VA):其中A為弧的集合

有向圖的基圖:忽略有向圖所有邊的方向,得到的無向圖就是該有向圖的基圖

說明:如果一個圖中某些邊具有方向性,而其他邊沒有方向性,這種圖可以稱為混合圖。

1.2完全圖,稀疏圖,稠密圖

完全圖:  

    定義:如果無向圖中任何兩個頂點之間都有一條邊,這種無向圖,稱為完全圖。

    性質:階數和邊數的關係  m = n * (n-1) / 2;

表示:階為n的完全圖用Kn表示。

有向完全圖:

定義:若果有向圖中任何一對頂點uv,都存在<u,v>

<v,u>兩條有向邊,這種有向圖稱為有向完全圖。

性質:階數和邊數的關係  m = n*(n-1);

稀疏圖:邊或者弧的數目相對較小(遠小於 n * (n-1) )的圖稱為稀疏圖,或者說邊或弧的數目 m < nlog(n)的無向圖或者有向圖,稱為稀疏圖,

稠密圖:邊或者弧的數目相對較多的圖(接近於完全圖或者有向完全圖)稱為稠密圖。

平凡圖:只有一個頂點的圖,即階 n = 1的圖稱為平凡圖,當n > 1的圖稱為非平凡圖。

零圖:邊的集合E(G)為空的圖,稱為零圖。

1.3頂點與頂點頂點與邊的關係

   說明:在無向圖和有向圖中,頂點與頂點之間的關係,以及頂點與邊的關係是通過“鄰接(Adjacency

)”這個概念表示的,

  在無向圖G(V,E)  如果(u,v)E(G)中的元素,即(uv)是圖中的一條無向邊,則成頂點u和頂點v互為鄰接頂點,邊(u,v)依附於頂點u和頂點v.,或稱邊(u,v)與頂點uv相關聯,此外稱有一個工圖頂點的兩條不同邊稱為鄰接邊。

在有向圖G(V,E)中,如果<u,v>E(G)中的元素,即<u,v>是圖中的一條有向邊,則稱頂點u鄰接到頂點v,頂點v鄰接子頂點u,邊<u,v>與頂點u和頂點v相關聯。

1.4頂點的度數和度的序列

   頂點的度數:一個頂點的度數是與它相關聯的邊的數目,記做deg(u).

在有向圖中,頂點的度數等於該頂點的出度與入度之和。

頂點u的出度:是以u為起始點的有向邊,(就是從頂點u出發的邊)的數目,記做od(u)

頂點u的入度:是以u為終點的有向邊(就是進入到頂點u的有向邊)的數目,記做id(u).

頂點u的度數:deg(u) = od(u) + id(u);  

定理  : 在無向圖和有向圖中,所有頂點度數總和都存在如下關係

  M = 1/2{Ʃdeg(Ui) }

說明:不管是有向圖還是無向圖,在統計所有頂點度數總和時,每條邊都統計了兩次。

偶點與奇點:把度數為偶數的頂點稱為偶點,把度數為奇數的頂點稱為奇點。

推論:每個圖都有偶數個奇點。

孤立頂點: 度數為零的頂點,稱為孤立頂點,孤立定點不與其他任何頂點鄰接。

葉(Leaf):度數為1的頂點,稱為葉。也稱為葉頂點,或端點,其他頂點稱為非葉頂點。

G的最大度(Maximum Degree):圖G所有頂點的最小的度數,記為δ(G

G的最小度(MiniMum Degree): 圖G所有頂點的最小的度數,記為△(G

1.5度序列與Havel-Hakimi定理

  度序列:如果把圖G所有頂點的度數排成一個序列s,則成為圖G的度序列。

應用:用Havel-Hakimi定理可以判定一個圖是否是可圖化的。

      可以根據該定理將s序列按照非遞增序列排序後,進行圖化然後構造圖。在構造的過程中出現負數則不能構造圖,則該圖不可圖化。

例子1

序列: 774,3,3,3,2,1

刪除首項然後往後面數七位每位減一

得到:6,3,2,2,2,1,0

刪除首項6然後往後面數六位每位減一

得到:2,1,1,1,0-1

此時出現負數了,則該序列不可圖化

例子2

序列s:5,4,3,3,3,2,2,2,1,1,1

刪除首項5,然後往後面數5位每位減一

得到:3,221,1,21,11重新排序得到

3,2,2,2,1,1,1,1,1

繼續刪除首項3,然後往後面數3位每位減一

得到1,1,111,1,1,1

依次可以得到

1,1,1,1,1,1,0

1,1,1,10,0

1,10,0,0

0,0,0,0

1.6二部圖與完全二部圖

二部圖:設無向圖為G(V,E),它的頂點集合V包含兩個沒有公共元素的子集,

X= {x1,x2,x3,x4.......}, Y={y1,y2,y3,y4,y5.......}

元素個數分別是st,,並且xixj1<=i,j<=s,yiyj1<=i,j<=t)沒有邊連線,則稱G為二部圖,也稱為二分圖

完全二分圖:在二部圖中如果頂點集合X中每個頂點xi與頂點集合Y中每個頂點yl都有邊相連,則稱G為完全二部圖

記為Ks,t st分別為集合X和集合Y中的頂點個數,在完全二部圖中Ks,t中共有s*t條邊

完全二部圖邊數公式 : Count(Ks,t) = s*t;

二部圖的判定定理:

 一個無向圖G是二部圖當且僅當G中無奇數長度的迴路;

圖的同構:(彼得鬆圖)

設有兩個圖G1G2,如果這兩個圖的區別僅在於圖的畫法與(或)頂點的標號方式,則稱它們是同構的。

查閱圖的同構定義。

1.7 子圖與生成樹

子圖:設有兩個圖G(V,E)G’(V’,E’)如果V’屬於V,且E’屬於E,則圖G’是圖G的子圖。

生成樹:一個無向連通圖的生成樹是它的包含所有頂點的極小連通子圖,極小指的是邊的數目極。

注: 如果圖中有n個頂點,則生成樹有n-1條邊,

一個無向連通圖可能有多個生成樹。

子圖

這裡討論兩種子圖的形式

一:頂點誘導子圖

設圖G’(V’,E’)是圖G(V,E)的子圖,且對於V’中的任意兩個頂點uv,只要(u,v)G中的邊,則一定是G’中的邊,此時這樣的子圖既是頂點誘導子圖。記為G[V’]

因為頂點是在G’中選的,如果G’中的邊在G中存在那麼就可以形成由頂點連成的子圖了

二:邊誘導子圖

E’作為邊集,以至少與E’中一條邊關聯的那些頂點構成頂點邊集V’,這個子圖G’(V’,E’)稱為是G的一個邊誘導子圖。記為G[E’];

說明:邊必須依附於頂點才能存在。

1.8路徑(Path

  定義:在圖GV,E)中,如果從頂點vi出發,沿著一些邊經過一些頂點Vp1,Vp2,,,,,vpm,到達頂點vj,則稱頂點序列(vi,vp1,vp2,vp3,,,,vpm,vj)為頂點vi到頂點vj的一條路徑,也叫通路

路徑的長度(Length):路徑中邊的數目通常稱為路徑的長度。

簡單路徑 (simple Path ):如果路徑上的vi,vp1,vp2,,,,vpm互相不重複,則這樣的路徑稱為簡單路徑。

迴路(circuit):如果路徑上第一個頂點vi與最後一個頂點vj重合,則稱這樣的路徑為迴路。迴路也稱為環(Loop);

簡單迴路(simple circuit):除第一個和最後一個頂點外,沒有頂點重複的迴路稱為簡單迴路。簡單迴路也稱為圈(Cycle

奇圈:路徑長度為奇數的圈稱為奇圈。

偶圈:路徑長度為偶數的圈稱為偶圈。

1.9連通性

連通:在無向圖中,如果頂點v到頂點u有路徑,則頂點v和頂點u是連通的。

連通圖

定義:無向圖中任意一一對頂點都是連通的,則稱此圖是連通圖。

否則為非連通圖。

連通分量:無向圖不是連通圖的情況下,其極大連通子圖稱為連通分量。這裡說的極大只得是子圖中包含的頂點個數極大。

在有向圖中的連通性

  強連通圖:在有向圖中,若果對每一對頂點uv,既存在從uv的路徑,也存在從vu的路徑,則稱此有向圖為強連通圖。

對於非強連通圖,其極大強連通子圖稱為強連通分量。

注意:在有向圖和無向圖中的子圖中連通分量就是子圖。

2.0權值,有向網,無向網

權值(weight):某些圖的邊具有與它相關的數,稱為權值。

權值的意義:這些權值可以表示從一個頂點到另一個頂點的距離,花費的代價,所需的時間。

網路:一個圖的所有邊都具有權值,稱為加權圖,也叫網路。

根據網路中的邊是否有方向性,又可以分為有向網,無向網。

1.2圖的儲存表示

圖的儲存表示有很多種,比較常用的有三種:

鄰接矩陣,鄰接表,鄰接多重表

1.2.1鄰接矩陣的表示方式

  有向圖和無向圖的鄰接矩陣

鄰接矩陣儲存方法需要一個記錄頂點資訊的陣列,還需要有一個記錄各個頂點間的關係的矩陣,這個矩陣稱為鄰接矩陣

使用 Edge[i][j] =  1<i,j>屬於E或者(i,j)屬於E

                 0 否則 

一般鄰接矩陣在計算機語言中使用二維陣列表示。頂點資訊陣列一般使用一維陣列表示。

在無向圖中的鄰接矩陣是沿對角線對稱的,而有向圖中的鄰接矩陣不一定是沿對角線對稱的。

無法用鄰接矩陣表示的情況,或者說其侷限性:如果圖中存在自身的環(就是連線自己的邊),或者重邊(存在多條邊起點一樣,終點也一樣),稱為平行邊

鄰接矩陣所體現的資訊

   對於無向圖: 如果Edge[i][j] = 1則表示頂點i和頂點j之間有一條邊。

因此,鄰接矩陣Edgei行所有元素中元素值為1的個數表示頂點i的度數,第i列所有元素值為1的個數也表示頂點i的度數。

   對於有向圖:如果Edge[i][j] = 1,則表示存在從頂點i到頂點j有一條有向邊,i是起點,j是終點,因此,在有向圖的鄰接矩陣中Edgei行所有元素中元素值為1的個數表示頂點i的出度,第i列所有元素值為1的個數表示頂點i的入度。

1.2.2有向網和無向網的鄰接矩陣

Edge[i][j] =

W(i,j)

若果 i!=j,<i,j> 或者 (i,j)

如果 i!=j,<i,j> 不屬於E或者(i,j)不屬於E

0

對角線上的位置,即 i = j

說明1:在程式設計實現中,可以用一個比較大的常量表示無窮大∞;

說明2:在ACM/ICPC的比賽中,為了處理方便可以將有向網或無向網的鄰接矩陣中對角線元素也定義成+;

說明3:在求解ACM/ICPC的題目時,可以採用鄰接矩陣儲存圖,但由於鄰接矩陣無法儲存帶自身的環或重邊,的圖,所以有時不得不採用鄰接表來儲存圖。

另外當圖的邊數(相對於鄰接矩陣中元素的個數即n*n)較少時,使用鄰接矩陣儲存會浪費較多的儲存空間,而使用鄰接表儲存可以節省儲存空間。

鄰接表:就是把從同一個頂點發出的邊連線在同一個稱為邊連結串列的單鏈表中。

邊連結串列的每個節點代表一條邊,稱為邊節點

每個邊節點有兩個域:該邊終結點的序號,還有一個指向下一個邊節點的指標。

在鄰接表中,還需要一個用於儲存頂點資訊的頂點陣列。

出邊表:在鄰接表中的每個頂點的邊連結串列,各邊結點所表示的邊都是從該頂點出發的邊,稱為出邊表

入邊表(逆鄰接表):進入同一個頂點的邊連結在同一個邊連結串列。

說明4:如果用鄰接表儲存有向網或無向網,則在邊結點中還應增加一個成員,用於儲存邊的權值。

1.2.3關於鄰接矩陣和鄰接表的進一步討論。

   1.儲存方式對演算法複雜度的影響

儲存方式的選擇對圖論演算法的的時間複雜度和空間複雜度有直接影響。(假設圖中有n個頂點,m條邊)

   時間複雜度:鄰接表中直接儲存了邊的資訊,瀏覽完所有的邊,對有向圖來說時間複雜度為Om.對無向圖時間複雜度是O2*m,而鄰接矩陣是間接儲存邊,瀏覽完所有的邊,複雜度是On*n);

   空間複雜度:鄰接表裡除了儲存m條邊所對應的邊結點外,還需要一個頂點陣列,粗成你各個定的資訊以及各邊連結串列的表頭指標,總的空間複雜度為On+m(O(n+2*m)),而用鄰接矩陣儲存圖需要n*n規模的儲存單元,其空間複雜度為On*n,當邊的數目相對較小時,鄰接矩陣裡儲存了較多的無用資訊,用鄰接表可以節省較多的儲存空間。

  2.在求解問題事可以靈活的儲存表示圖

當圖中頂點個數確定以後(這裡假設頂點序號是連續的),圖的結構就唯一地取決於邊的資訊,因此可以把每條邊的資訊(起點,終點,邊的權值等)儲存到一個數組裡,在針對該圖進行某種處理時,只需要訪問邊的陣列中每個元素即可,在4.2節中的Bellman-Ford演算法。可以使用這種儲存方式實現。