圖論詳細至定義定理之入門

一、圖的基本概念

1.1 圖的定義


定義1:圖 G=(V,E)G=(V,E) 是一個系統,其中V是非空有限集合,V中的元素稱爲結點;E是有限集合,E中的元素稱爲邊;且E中的元素與V中的一對元素相連繫。

例1:有四個城市v1,v2v3,v4v_{1},v_{2},v_{3},v_{4},其中v1v2v_{1}與v_{2},v1v4v_{1}與v_{4},v2v3v_{2}與v_{3}有公路相連。

答:上述事實可用圖G=(V,E)G=(V,E)表示。圖中結點集合V = {v1,v2,v3,v4v_1,v_2,v_3,v_4},圖中邊的集合E = {v1v2v1v4,v2v3v_1與v_2之間的邊,v_1與v_4之間的邊,v_2與v_3之間的邊}

例2:有四個程序,他們之間存在如下的調用關係:P1調P2P2調P3P2調P4P_1能調用P_2,P_2能調用P_3,P_2能調用P_4

答:上述事實也可用圖G=(V,E)G=(V,E)表示。圖中結點集合V = {P1,P2,P3,P4P_1,P_2,P_3,P_4},圖中邊的集合E = {P1P2P2P3P2P4P_1到P_2的邊,P_2到P_3的邊,P_2到P_4的邊}


定義2:圖G=(V,E)G=(V,E)是一個系統,其中V是非空有限集合,V中的元素稱爲結點;E是集合V上的關係EV×VE \subseteq V \times V,E中的元素稱爲邊。

例3:同例1,例2。

答:例1可表示爲:V = {v1,v2,v3,v4v_1,v_2,v_3,v_4},E = {(v1,v2),(v2,v1),(v1,v4),(v4,v1),(v2,v3),(v3,v2)(v_1,v_2),(v_2,v_1),(v_1,v_4),(v_4,v_1),(v_2,v_3),(v3_,v_2)}。

例2 可表示爲:V={P1,P2,P3,P4},E={(P1P2),(P2P3),(P2P4)}V = \{P_1,P_2,P_3,P_4\},E = \{(P_1,P_2),(P_2,P_3),(P_2,P_4)\}


定義3:設V是非空有限集合 \sum 是一個標號集合,EV××VE \subseteq V \times \sum \times V, 稱 G=(V,,E)G = (V, \sum, E)爲一個圖。稱V中的元素爲G的結點;設 u,vVu, v \in V, σ\sigma \in \sum, 若u,σ,vE(u,\sigma,v)\in E,則稱u,σ,v(u,\sigma,v)爲G中的一條邊,此邊起自於u終止與v;稱u爲邊u,σ,v(u,\sigma,v)的起點,v爲邊u,σ,v(u,\sigma,v)的重點,起點或終點統稱爲邊u,σ,v(u,\sigma,v)的端點。

定義4:圖G=(V,E)G=(V,E) 是一個系統。其中V是結點的非空有限集合;E是邊的有限集合;γ\gamma 是邊到結點集的一個關聯函數,即 γ:E2V\gamma:E \to 2^V。一般來說,它將E中的每條邊 eEe \in E 與結點集V中的一個二元子集 {u,v}2V\{u,v\} \in 2^V 相關聯,即 γ(e)={u,v}\gamma(e) = \{u,v\},結點u和v統稱爲邊e的端點。

1.2 圖的常見類型

對圖的定義一般採用定義2的方式,並將擁有n個結點,m條邊的圖稱爲(n,m)圖。

G=(V,,E)G = (V,\sum,E),圖的類型一般有:

  1. 無向圖:在圖G中,若uσ,v(u,\sigma,v)vσ,u(v,\sigma,u)表示同一條邊,則稱此邊爲無向邊;若G中所有邊都是無向邊,則稱G爲無向圖
  2. 有向圖:若G中所有邊都是有向邊,則稱G爲有向圖。
  3. 混合圖:若G中,既有有向邊,又有無向邊,則稱這種圖爲混合圖。
  4. 零圖:若在圖G中E = \emptyset,則稱G爲零圖。
  5. 平凡圖:稱只有一個結點的圖爲平凡圖。

G=(V,,E)G = (V,\sum,E),邊與邊,結點與邊,結點與結點之間的關係一般有:

  1. 邊鄰接:若G中有兩條邊有一個公共端點,則稱此二邊鄰接。
  2. 結點相鄰:若G中的兩個結點是同一條邊上的兩個端點,則稱此二結點相鄰。
  3. 關聯:若G中的節點v是邊e的端點,則稱節點v與邊e相關聯。
  4. 孤立點:不與任何邊相關聯的點稱爲孤立點。
  5. 自環:關聯於同一節點的一條邊稱爲自環。

在圖G中,邊的關係一般有:

  1. 平行邊:若兩條邊有相同的端點(對有向圖則有相同的起點和終點),則稱此二邊爲平行邊。
  2. 重數:兩節點之間平行邊的條數成爲平行邊的重數。
  3. 多重圖:若圖G中有平行邊存在,則稱此圖爲多重圖。
  4. 簡單圖:若圖G中無平行邊且無自環,則稱圖G爲簡單圖。

1.3 子圖與補圖


定義5:設G=(V,E)G=(V,E)爲簡單圖,若G中每一對不同的結點間都有邊相連,則稱G爲完全圖。
設G有n個結點,m條邊。當G爲無向完全圖是,則有m = n(n-1)/2;當G爲有向完全圖時,則有m = n(n-1)。一般將n個節點的無向完全圖記爲KnK_n


定義6:設有圖G= (V,E)和圖G=(V,E)G^` = (V^`,E^`)

  1. 子圖:若VVV^` \subseteq V , EEE^` \subseteq E,則稱GG^`爲G的子圖。
  2. 真子圖:若VVV^` \subset V , EEE^`\subset E,則稱GG^`爲G的真子圖。
  3. 生成子圖(又稱支撐子圖)V=VV^` = V , EEE^`\subseteq E,則稱GG^`爲G的生成子圖。
  4. 平凡子圖V=VV^` = V , E=EE^` = EV=VV^` = V , E=E^` = \emptyset,稱這兩個子圖爲平凡子圖。

定義7:設G=(V,E)G=(V,E)爲一簡單圖,G=(V,E)G^* = (V,E^*)爲完全圖,稱 G=(V,E)\overline{G} = (V,\overline{E})爲G的補圖,其中 E=E\overline{E} = E^* \ EE.


定義8:設G=(V,E)G=(V,E)是圖,

  1. 當G爲有向圖時,G中以v爲起點的邊的條數成爲v的出度,記爲deg(v)\overleftarrow{deg}(v);以v爲終點的邊的條數成爲v的入度,記爲deg(v)\overrightarrow{deg}(v);入度和出度之和成爲v的度,記爲deg(v)deg(v)
  2. 當G爲無向圖時,以v爲端點的邊的條數稱爲v的度,記爲deg(v)deg(v)

當某節點的度數爲奇數,稱此結點爲奇結點;若結點的度數爲偶數,則稱此節點爲偶結點
稱度數爲1的節點爲懸掛點,與懸掛點關聯的邊稱爲懸掛邊


定理1:設G=(V,E)G=(V,E)是(n,m)無向圖,則i=1ndeg(vi)=2m\sum_{i=1}^n{deg(v_i)} = 2m

定理2:設G=(V,E)G=(V,E)是(n,m)有向圖,則i=1ndeg(vi)=i=1ndeg(vi)=m\sum_{i=1}^n{\overleftarrow{deg}(v_i)} = \sum_{i=1}^n{\overrightarrow{deg}(v_i)} = m

定理3:設G=(V,E)G=(V,E)是(n,m)無向圖,則奇結點的個數爲偶數。


二、圖的同構

1.1 圖的同構的定義

定義9:設G=(V,E)G=(V,E)G=(V,E)G^`=(V^`,E^`)是兩個簡單無向圖,若存在從V到VV^`的雙射函數h,使得e={vi,vj}Ee = \{v_i,v_j\} \in E 當且僅當e={hvi,h(vj)}Ee^` = \{h(v_i),h(v_j)\}\in E^`,則稱圖G與圖GG^`同樣。

必要條件(不是充分條件):

  1. 結點數相等;
  2. 邊數相等;
  3. 度數相同的結點個數相等。
    注意同構是一個等價關係、

定義10:設G=(V,E)G=(V,E)G=(V,E)G^` = (V^`,E^`)是兩個簡單有向圖,若存在從V到VV^`的雙射函數h,使得e={vi,vj}Ee = \{v_i,v_j\} \in E 當且僅當e={hvi,h(vj)}Ee^` = \{h(v_i),h(v_j)\}\in E^`,則稱圖G與圖GG^`同構。

三、路與圈

3.1 路與圈的定義

定義11:設G=(V,E)G=(V,E),W是G的有限非空點邊交錯序列 W=v0e1v1e2v2ekvkW = v_0e_1v_1e_2v_2…e_kv_k 稱W爲G的一條從v0v_0vkv_k的途徑,稱v0v_0爲途徑的起點,vkv_k爲途徑的終點,k爲途徑的長度。

定義12:在途徑W中,如v0vkv_0 \not= v_k,則稱W是從v0v_0vkv_k的一條路;若v0=vkv_0 = v_k,則稱W是圈。

定義13:無重複邊的路稱爲簡單路,無重複邊的圈稱爲簡單圈,無重複點的路稱爲初級路,無重複點的圈稱爲初級圈。

定理4:設G=(V,E)G=(V,E)爲一簡單圖,|V| = n,則:

  1. G中任一初級路的長度不超過n-1;
  2. G中任一初級圈的長度不超過n。

3.2 路與圈的可達性

定義14:設G=(V,E)G=(V,E)是圖,任取u,v \in V,如果G中存在一條從u到v的路,則稱u可達v。(規定u到自己總是可達的)

無向圖中,從u可達v,很明顯,v可達u成立;
然而有向圖中,u可達v,v不一定可達u。所以規定:uvuvvuu,v相互可達 \leftrightarrow u可達v \wedge v可達u

從u可達v的所有路中最短的那一條稱爲短程線(短線程不一定是唯一的)。並經短程線的長度叫做從u到v的距離,用d(u,v)d(u,v)表示。規定:

  1. d(u,v)=0d(u,v)=0;
  2. 若u到v不可達,則d(u,v)=d(u,v)=\infty

3.3 圖的連通性

3.3.1 無向圖的連通性

定義15:設G=(V,E)G=(V,E)無向圖,如果G中任意兩結點間均可達,則稱圖G是連通的,即G是連通圖,否則稱圖G是非連通的,即G是非連通圖。

極大連通子圖:對於無向圖(並不一定是連通的),如果是連通圖,那自己就是極大連通子圖;如果是非連通圖,則必然有獨立出來的路或圈,而將這些部分按照相互不連通,進行劃分,每一個劃分塊都是給定圖的一個連通子圖,而在每一個劃分塊中結點間的可達性已達到極大限度。

定義16:設G=(V,E)G=(V,E)無向圖,G的一個極大連通子圖稱爲G的一個連通支。(非連通無向圖中一般連通支數 \geq 2。)

3.3.2 有向圖的連通性

定義17:設G=(V,E)G=(V,E)有向圖

  1. 若G中任意兩結點間都是相互可達的,則稱G是強連通的;
  2. 若G中任意兩結點間至少有一結點可到達另一結點,則稱G是單連通的
  3. 若略去邊的方向後,G的無向圖時連通的,則稱G是弱連通的。

(弱連通,可能既不是單連通的,也不是強聯通的;強聯通一定是單連通和弱連通的;單連通一定是弱連通的,但不一定是強聯通的。)

定義18:設G=(V,E)G=(V,E)簡單有向圖,稱G的極大的強連通子圖爲G的強連通支;稱G的極大的單向連通子圖爲G的一個單向連通支;稱G的極大的若連通子圖爲G的一個若連通支。(注意:提到強,單向,弱就是有向圖)

有向圖的強連通性及弱連通性建立了G中節點集合V上的等價關係,即有向圖強/弱連通性都可以通過結點集合V來表示,但兩者還是有區別的。

弱連通,不僅建立了結點集上的劃分,而且還建立了邊集上的劃分。
設$G_1,G_2,…,G_k,爲G的所有弱連通支,則有:

V(G1)V(G2)...V(Gk)=V(G)E(G1)E(G2)...E(Gk)=E(G) \begin{matrix} V(G_1) \cup V(G_2) \cup ... \cup V(G_k) = V(G) \\ E(G_1) \cup E(G_2) \cup ... \cup E(G_k) = E(G) \end{matrix}

iji \not= j時,有:

V(Gi)V(Gj)=E(Gi)E(Gj)= \begin{matrix} V(G_i) \cap V(G_j) = \emptyset \\ E(G_i) \cap E(G_j) = \emptyset \\ \end{matrix}

強連通,只能建立結點集上的劃分,而不能建立邊集上的劃分。
設$G_1,G_2,…,G_k,爲G的所有強連通支,則有:

V(G1)V(G2)...V(Gk)=V(G)E(G1)E(G2)...E(Gk)E(G) \begin{matrix} V(G_1) \cup V(G_2) \cup ... \cup V(G_k) = V(G) \\ E(G_1) \cup E(G_2) \cup ... \cup E(G_k) \subseteq E(G) \end{matrix}
iji \not= j時,有V(Gi)V(Gj)=V(G_i) \cap V(G_j) = \emptyset

定理5:在簡單有向圖G=(V,E)G=(V,E)中:

  1. 每一個結點及每一條邊恰在一個弱連通中;
  2. 每一個結點恰在一個強連通支中;
  3. 每一個結點,每一條邊至少屬於一個單向連通支。

四、圖的矩陣表示

4.1 鄰接矩陣

4.1.1 鄰接矩陣的定義及強行命名

定義19:設G=(V,E)G=(V,E)簡單有向圖V=v1,v2,...,vnV={v_1,v_2,...,v_n}被強行命名,稱n階方陣A=(aij)n×nA = (a_{ij})_{n \times n}爲G的鄰接矩陣。其中:
aij={1,(vi,vj)E0,(vi,vj)E a_{ij}=\begin{cases} 1,&(v_i,v_j) \in E \\ 0,&(vi,vj) \notin E \end{cases}

定義中的強行命名是指:給VV中的各結點從v1vnv_1到v_n確定一個排隊的次序。當強行命名改變時,即結點次序改變,圖的鄰接矩陣也會變化。

對於一個給定的圖,我們能用一個主對角線全爲零的方陣將結點間的鄰接關係反應出來;
對於一個對角線全爲零、元素爲0或1的方陣,我們可以將其表示成一個圖。

若圖G1G2G_1與G_2同構,則它們相對應的鄰接矩陣A(G1)A(G2)A(G_1)與A(G_2)或者相同,或者其中的一個通過行與列的交換能轉換成另一個。

  • 零圖:鄰接矩陣元素全是零;
  • 完全圖:除對角線上全是零外,其餘元素均爲1;
  • 圖對稱:鄰接矩陣按主對角線對稱,即A=ATA = A^{T}

4.1.2 利用鄰接矩陣求各結點的入度和出度

如:
A=[0100001111011000] A = \begin{bmatrix} 0&1&0&0\\ 0&0&1&1\\ 1&1&0&1\\ 1&0&0&0 \end{bmatrix}
aija_{ij}表示邊(vi,vj)(v_i,v_j),取值決定這條邊是否存在。

deg(vi)=ai1+ai2+...+ain=k=1naikdeg(vi)=a1i+a2i+...+ani=k=1naikdeg(vi)=k=1n(aik+aki) \overleftarrow{deg}(v_i)=a_{i1}+a_{i2}+...+a_{in}=\sum_{k=1}^{n}a_{ik} \\ \overrightarrow{deg}(v_i)=a_{1i}+a_{2i}+...+a_{ni}=\sum_{k=1}^{n}a_{ik} \\ deg(v_i)=\sum_{k=1}^n(a_{ik}+a_{ki})
試:根據矩陣A,計算結點v2v_2的度數:
結點v2v_2出度(以v2v_2爲起點的邊的條數):
deg(v2)=a21+a22+a23+a24=2\overleftarrow{deg}(v_2)=a_{21}+a_{22}+a_{23}+a_{24}=2
結點v2v_2入度(以v2v_2爲終點的邊的條數):
deg(v2)=a12+a22+a32+a42=2\overrightarrow{deg}(v_2)=a_{12}+a_{22}+a_{32}+a_{42}=2
deg(v2)=deg(v2)+deg(v2)=4{deg}(v_2)=\overleftarrow{deg}(v_2)+\overrightarrow{deg}(v_2)=4

4.1.3 鄰接矩陣中AATAA^TATAA^TA中元素的含義

形如:

B=AAT,bij=k=1n(aikakjT)=k=1n(aikajk);B = AA^T,\\b_{ij} = \sum_{k=1}^{n}({a_{ik} \cdot a_{kj}^T})=\sum_{k=1}^{n}(a_{ik}\cdot a_{jk});

注意akjTakja_{kj}^T 就是 a_{kj},而且普遍情況下:akjTajka_{kj}^T \not= a_{jk},之所以上面的bijb_{ij}的公式成立,是因爲這是矩陣AA乘以矩陣自身的轉置ATA^T運算的規律。

如:

A=[0100001111011000] A = \begin{bmatrix} 0&1&0&0\\ 0&0&1&1\\ 1&1&0&1\\ 1&0&0&0 \end{bmatrix},

B=[0100001111011000][0011101001000110]=[1010021111310011] B= \begin{bmatrix}0&1&0&0\\0&0&1&1\\1&1&0&1\\1&0&0&0\end{bmatrix} \cdot \begin{bmatrix}0&0&1&1\\1&0&1&0\\0&1&0&0\\0&1&1&0\end{bmatrix}= \begin{bmatrix}1&0&1&0\\0&2&1&1\\1&1&3&1\\0&0&1&1\end{bmatrix}

  • b11=1b_{11}=1是相當於:(v1v1v1v1)(v1v2v1v2)(v1v3v1v3)(v1v4v1v4)=0+1+0+0=1(v_1不可達v_1 \cap v_1不可達v_1) \cup (v_1可達v_2 \cap v_1可達v_2) \cup (v_1不可達v_3 \cap v_1不可達v_3) \cup (v_1不可達v_4 \cap v_1不可達v_4) = 0 + 1 + 0 + 0 = 1;
  • b23=1b_{23}=1是相當於:(v2v1v3v1)(v2v2v3v2)(v2v3v3v3)(v2v4v3v4)=0+0+0+1=1(v_2不可達v_1 \cap v_3可達v_1) \cup (v_2不可達v_2 \cap v_3可達v_2) \cup (v_2可達v_3 \cap v_3不可達v_3) \cup (v_2可達v_4 \cap v_3可達v_4) = 0 + 0 + 0 + 1 = 1;
  • b22=2b_{22}=2是相當於:(v2v1v2v1)(v2v2v2v2)(v2v3v2v3)(v2v4v2v4)=0+0+1+1=2(v_2不可達v_1 \cap v_2不可達v_1) \cup (v_2不可達v_2 \cap v_2可達v_2) \cup (v_2可達v_3 \cap v_2可達v_3) \cup (v_2可達v_4 \cap v_2可達v_4) = 0 + 0 + 1 + 1 = 2;
  • b33=3b_{33}=3是相當於:(v3v1v3v1)(v3v2v3v2)(v3v3v3v3)(v3v4v3v4)=1+1+0+1=3(v_3可達v_1 \cap v_3可達v_1) \cup (v_3可達v_2 \cap v_3可達v_2) \cup (v_3不可達v_3 \cap v_3不可達v_3) \cup (v_3可達v_4 \cap v_3可達v_4) = 1 + 1 + 0 + 1 = 3;

bij=1b_{ij}=1,則表示存在一個節點vk0v_{k_0}使,從viv_ivjv_j發出的邊都終止於它;如b23=1v2v3v4b_{23}=1,有v_2,v_3終止於v_4
同理,若bij=2b_{ij}=2,則表示存在兩個節點,使從viv_ivjv_j發出的邊都終止於它們;
因此,bijb_{ij}的值表示了從vi和vj發出的邊終止與同一結點的結點數目。
i=ji=j時,B的主對角線上的元素值表示了結點viv_i的出度
,即:bij=k=1n(aikaik)=k=1naik=deg(vi)b_{ij}=\sum_{k=1}^{n}({a_{ik} \cdot a_{ik}})=\sum_{k=1}^na_{ik}=\overleftarrow{deg}(v_i)
如:b11=1b_{11}=1是相當於:
(v1v1v1v1)(v1v2v1v2)(v1v3v1v3)(v1v4v1v4)=(v1v1)(v1v2)(v1v3)(v1v4)=0+1+0+0=1 \begin{matrix} (v_1不可達v_1 \cap v_1不可達v_1) \cup (v_1可達v_2 \cap v_1可達v_2) \cup (v_1不可達v_3 \cap v_1不可達v_3) \cup (v_1不可達v_4 \cap v_1不可達v_4) \\= (v_1不可達v_1) \cup (v_1可達v_2) \cup (v_1不可達v_3) \cup (v_1不可達v_4) \\= 0 + 1 + 0 + 0 = 1; \end{matrix}
按照同樣的道理:
B=ATA,bij=k=1naikTakj=k=1nakiaki B=A^TA,\\ b_{ij}=\sum_{k=1}^{n}a_{ik}^T \cdot a_{kj}=\sum_{k=1}^n a_{ki} \cdot a_{ki}
bijb_{ij}的值表示存在着這些數量的結點使由它們發出的邊同時終止與viv_ivjv_j
i=ji=j時,B的主對角線上的元素值表示了結點viv_i的入度
,即
bij=k=1naikTakj=k=1nakiaki=k=1naki=deg(vi)b_{ij}=\sum_{k=1}^{n}a_{ik}^T \cdot a_{kj}=\sum_{k=1}^n a_{ki} \cdot a_{ki}=\sum_{k=1}^n a_{ki}=\overrightarrow{deg}(v_i)

4.1.4 鄰接矩陣中AnA^n中的元素的意義

  • n=1n=1時,A1=(aij1)n×n,aij=1A^1 = (a_{ij}^1)_{n\times n},a_{ij}=1表示存在一條邊(vi,vj)(v_i,v_j),即從vivjv_i到v_j存在一條長度爲1的路。
  • n=2n=2時,A2=(aij2)n×n,aij2=k=1naikakjA^2=(a_{ij}^2)_{n\times n},a_{ij}^2=\sum_{k=1}^na_{ik}\cdot a_{kj},
    • aij2=1(k0)(aik0=1ak0j=1),a_{ij}^2=1 \Leftrightarrow (僅\exists k_0)(a_{ik_0}=1 \wedge a_{k_0j}=1),aik0=1ak0j=1a_{ik_0}=1 及 a_{k_0j}=1知:存在一條從vivjv_i到v_j的長度爲2的路。
    • aij2=2(k0k1)(aik0=1ak0j=1aik1=1ak1j=1),a_{ij}^2=2 \Leftrightarrow (僅\exists k_0,k_1)(a_{ik_0}=1 \wedge a_{k_0j}=1 \wedge a_{ik_1}=1 \wedge a_{k_1j}=1),aik0=1,ak0j=1,aik1=1,ak1j=1a_{ik_0}=1 , a_{k_0j}=1 , a_{ik_1}=1 , a_{k_1j}=1知:存在兩條從vivjv_i到v_j的長度爲2的路。

由此得知:aij2a_{ij}^2表示由vivjv_i到v_j的長度爲2的不同路的總數;而aii2a_{ii}^2表示經過viv_i的長度爲2的圈數。

    • aij2=0a_{ij}^2=0 表示從vivjv_i到v_j的沒有長度爲2的路(有沒有其他長度的路不一定)
  • 一般的:Al+1=(aijl+1)n×n,aijl+1=k=1naiklakj1;A_{l+1}=(a_{ij}^{l+1})n\times n,\\a_{ij}^{l+1}=\sum_{k=1}^na_{ik}^l \cdot a_{kj}^1;
    aijl+1vivjl+1a_{ij}^{l+1}表示從v_i到v_j的長度爲l+1的路的總數。

定理6:設GG爲簡單有向圖,AA是它的鄰接矩陣,則aijma_{ij}^mvi由v_ivjv_j的長度爲m的路的條數。(這裏的路和圈都未必是簡單路,簡單圈。)

4.2 可達矩陣

4.2.1 可達矩陣的定義

根據定理4:在一個(n,m)(n,m)圖中,任一初級路(無重複點)的長度小於等於n1n-1,任一初級圈的長度小於等於nn
若從vivjv_i到v_j有路,則從v_i到v_j必有一條初級路;若從v_i到v_j有圈,則必有一條長度不超過n的初級圈。
B=A+A2+A3++An B=A+A^2+A^3+…+A^n
Bbijvivj1n矩陣B的元素b_{ij}給出了由v_i到v_j的所有長度從1到n的路的總條數
e.g.e.g.B=A+A2+A3+A4=[3423554677473212] B=A+A^2+A^3+A^4 = \begin{bmatrix}3&4&2&3\\5&5&4&6\\7&7&4&7\\3&2&1&2\end{bmatrix}
從結點v_2v_4之間共有6條路。
如果結點很多將可能會有更多的路,現在將注意點放到是否有路這一問題上,需要將矩陣B進行改造,並用下面定義的矩陣R來描述圖G的各結點見間的可達性。

定義20:G=(V,E)V=v1,v2,...,vnnR=rijn×nG設G=(V,E)是簡單有向圖,V={v_1,v_2,...,v_n}被強行命名,n階方陣稱R=(r_{ij})n \times n爲圖G的可達矩陣,其中
rij={1,vivj0,vivj r_{ij}=\begin{cases}1,&v_i到v_j可達\\0,&v_i到v_j不可達\end{cases}
特別是
rii={1,vivi0,vivi r_{ii}=\begin{cases}1,&v_i到v_i有圈\\0,&v_i到v_i無圈\end{cases}
在可達性的規定中 viv_iviv_i 總是可達的,而上面定義中是說 rii=1r_{ii}=1 是表示viv_iviv_i有圈,這兩者不衝突,只是鄰接矩陣的定義中 (vi,vi)E(v_i,v_i) \notin E中。
所以,rii=1r_{ii}=1時,表示的是vi,vi,vi從v_i出發,經過非v_i結點,可以回到v_irii=1r_{ii}=1時,表示G中至少有一條通過viv_i的有向圈。

如何去確定一個給定圖的可達矩陣:

  1. 先求出圖G的鄰接矩陣A;
  2. 然後求A2,A3,A4,...,AnA^2,A^3,A^4,...,A^n,由此得到矩陣B;
  3. 由B確定R。

R=AA(2)A(3)...A(n)R=A\vee A^{(2)}\vee A^{(3)}\vee... \vee A^{(n)}

e.g.e.g.:給定圖G=(V,E)
在這裏插入圖片描述

將V強行命名爲V=v1,v2,v3,v4V={v_1,v_2,v_3,v_4},則G的鄰接矩陣爲
A=[0001101100000110]A=\begin{bmatrix}0&0&0&1\\1&0&1&1\\0&0&0&0\\0&1&1&0\end{bmatrix}
同時有:
A(2)=[0110011100001011],A(3)=[1011111100000111],A(4)=[1011111100000111]A^{(2)}=\begin{bmatrix}0&1&1&0\\0&1&1&1\\0&0&0&0\\1&0&1&1\end{bmatrix},A^{(3)}=\begin{bmatrix}1&0&1&1\\1&1&1&1\\0&0&0&0\\0&1&1&1\end{bmatrix},A^{(4)}=\begin{bmatrix}1&0&1&1\\1&1&1&1\\0&0&0&0\\0&1&1&1\end{bmatrix}
所以,G的可達矩陣爲
R=[1111111100001111]R=\begin{bmatrix}1&1&1&1\\1&1&1&1\\0&0&0&0\\1&1&1&1\end{bmatrix}

4.2.1 WarshallWarshall 算法

給定圖G=(V,E)G=(V,E),將結點集VV強行命名爲V=1,2,3,...,n,WarshallV={1,2,3,...,n},Warshall算法的基本思想是構造一個矩陣序列
A=R(0),R(1),R(2),...,R(n)=RA=R^{(0)},R^{(1)},R^{(2)},...,R^{(n)} =R
這裏R(0)=AR^{(0)}=A是鄰接矩陣,R=R(n)R=R^{(n)}就是可達矩陣。

WarshallWarshall 算法步驟,以vivjv_i到v_j是否有路爲例:

  • 第一步:由A求R(0)R^{(0)}R(0)=AR^{(0)}=Arij(0)=aijr_{ij}^{(0)}=a_{ij}
    其中rij(0)R(0)r_{ij}^{(0)}爲R^{(0)}的元素,aija_{ij}爲鄰接矩陣A的元素。
  • 第二步:由R(0)R^{(0)}R(1)R^{(1)}rij(1)=rij(0)(ri1(0)r1j(0))r_{ij}^{(1)}=r_{ij}^{(0)}\vee (r_{i1}^{(0)}\wedge r_{1j}^{(0)})
    • 其含義是:
    1. rij(0)r_{ij}^{(0)}用來判斷是否直接有邊相連,若結點viv_i到結點vjv_j直接有邊相連,則rij(1)=1r_{ij}^{(1)}=1;
    1. (ri1(0)r1j(0))(r_{i1}^{(0)}\wedge r_{1j}^{(0)})用來判斷結點viv_i是否經過結點v1v_1可達vjv_j,若結點viv_i到結點v1v_1有邊,且結點v1v_1到結點vjv_j有邊,即結點vi,vjv_i,v_j可通過結點v1v_1相連,則rij(1)=1r_{ij}^{(1)}=1
  • 第三步:由R(1)R^{(1)}R(2),R^{(2)},rij(2)=rij(1)(ri2(1)r2j(1))r_{ij}^{(2)}=r_{ij}^{(1)}\vee (r_{i2}^{(1)}\wedge r_{2j}^{(1)})
    • 其含義是:
    1. rij(1)=1r_{ij}^{(1)}=1,即結點viv_i到結點vjv_j直接有邊相連或通過結點1相連時,則rij(2)=1r_{ij}^{(2)}=1;
    1. ri2(1)=1r_{i2}^{(1)}=1(即結點viv_i到結點v2v_2直接有邊或通過結點v1v_1相連),r2j(1)=1r_{2j}^{(1)}=1(即結點v2v_2到結點vjv_j直接有邊或通過結點v1v_1相連),則rij(2)=1r_{ij}^{(2)}=1
    • rij(2)=1r_{ij}^{(2)}=1 \Leftrightarrow 結點viv_i到結點vjv_j直接有邊相連或通過結點v1v2v_1、v_2相連;

  • kk步:由R(k1)R^{(k-1)}R(k)R^{(k)}rij(k)=rij(k1)(rik(k1)rkj(k1))r_{ij}^{(k)}=r_{ij}^{(k-1)}\vee (r_{ik}^{(k-1)}\wedge r_{kj}^{(k-1)})
    • 其含義是:
    1. rij(k)=1r_{ij}^{(k)}=1 \Leftrightarrow 結點viv_i到結點vjv_j直接有邊相連或通過結點v1,v2,...,vkv_1,v_2,...,v_k相連。

  • nn步:由R(n1)R^{(n-1)}R(n)R^{(n)}rij(n)=rij(n1)(rin(n1)rnj(n1))r_{ij}^{(n)}=r_{ij}^{(n-1)}\vee (r_{in}^{(n-1)}\wedge r_{nj}^{(n-1)})
    • 其含義是:
    1. rij(n)=1r_{ij}^{(n)}=1 \Leftrightarrow 結點viv_i到結點vjv_j之間可以通過不超過n的結點相連。

e.g.e.g.:用WarshallWarshall算法求圖G的可達矩陣。
在這裏插入圖片描述
VV強行命名爲V={1,2,3,4}V=\{1,2,3,4\},則

R(0)R^{(0)} R(1)R^{(1)} R(2)R^{(2)} R(3)R^{(3)}
rij(0)=aijr_{ij}^{(0)}=a_{ij} rij(1)=rij(0)(rik(0)rkj(0))r_{ij}^{(1)}=r_{ij}^{(0)}\vee (r_{ik}^{(0)} \wedge r_{kj}^{(0)}) rij(2)=rij(1)(rik(1)rkj(1))r_{ij}^{(2)}=r_{ij}^{(1)}\vee (r_{ik}^{(1)} \wedge r_{kj}^{(1)}) rij(3)=rij(2)(rik(2)rkj(2))r_{ij}^{(3)}=r_{ij}^{(2)}\vee (r_{ik}^{(2)} \wedge r_{kj}^{(2)})
for i in rang(n):for i in rang(n):rij(0)\\for\ i\ in\ rang(n):\\ \hspace{5mm}for\ i\ in\ rang(n):\\\hspace{5mm}r_{ij}^{(0)} for i in rang(n):for j in rang(n):for k in rang(n):rij(1)=rij(0)(rik(0)rkj(0)) for\ i\ in\ rang(n):\\ \hspace{5mm}for\ j\ in\ rang(n):\\ \hspace{1cm}for\ k\ in\ rang(n):\\\hspace{2.5cm}r_{ij}^{(1)}=r_{ij}^{(0)}\vee (r_{ik}^{(0)} \wedge r_{kj}^{(0)}) for i in rang(n):for j in rang(n):for k in rang(n):rij(2)=rij(1)(rik(1)rkj(1))for\ i\ in\ rang(n):\\ \hspace{5mm}for\ j\ in\ rang(n):\\ \hspace{1cm}for\ k\ in\ rang(n):\\ \hspace{2.5cm}r_{ij}^{(2)}=r_{ij}^{(1)}\vee (r_{ik}^{(1)} \wedge r_{kj}^{(1)}) for i in rang(n):for j in rang(n):for k in rang(n):rij(3)=rij(2)(rik(2)rkj(2))for\ i\ in\ rang(n):\\ \hspace{5mm}for\ j\ in\ rang(n):\\ \hspace{1cm}for\ k\ in\ rang(n):\\ \hspace{2.5cm}r_{ij}^{(3)}=r_{ij}^{(2)}\vee (r_{ik}^{(2)} \wedge r_{kj}^{(2)})

R(0)=A=[0100001111011000],R(1)=[0100001111011100],R(2)=[0111001111111111],R(3)=[1111111111111111],R(4)=[1111111111111111]=R R^{(0)}=A=\begin{bmatrix}0&1&0&0\\0&0&1&1\\1&1&0&1\\1&0&0&0\end{bmatrix}, R^{(1)}=\begin{bmatrix}0&1&0&0\\0&0&1&1\\1&1&0&1\\1&1&0&0\end{bmatrix}, R^{(2)}=\begin{bmatrix}0&1&1&1\\0&0&1&1\\1&1&1&1\\1&1&1&1\end{bmatrix}, R^{(3)}=\begin{bmatrix}1&1&1&1\\1&1&1&1\\1&1&1&1\\1&1&1&1\end{bmatrix}, R^{(4)}=\begin{bmatrix}1&1&1&1\\1&1&1&1\\1&1&1&1\\1&1&1&1\end{bmatrix}=R

運用WarshallWarshall算法求GG的可達矩陣不僅節省時間,而且節約了空間。

4.3 可達矩陣與圖的連通性

有向圖的連通性,有下列判斷方法:

  1. G是強連通的 \Leftrightarrow R是全1的矩陣;
  2. G是單向連通的 \Leftrightarrow RRTR \vee R^T的元素除主對角線外全是1;
  3. G是弱連通的 \LeftrightarrowAATA\vee A^T確定的R是全1矩陣;
  4. G中有圈 \Leftrightarrow R中某些主對角線的元素rii=1r_{ii}=1

五、帶權圖的最短路徑

5.1 帶權圖的定義

定義21:設G=(V,E)G=(V,E)簡單圖,若對於每一個eEe\in E,均有一正實數W(e)W(e)與之對應,則稱WWGG的權函數,並稱GWG爲帶有權W的圖,簡稱帶權圖。

定義22:設M=(ei1,ei2,...,eik)\mathcal{M}=(e_{i_1},e_{i_2},...,e_{i_k})是帶權圖中的一條路,M\mathcal{M}的路長爲W(M)=l=1kW(eil)W(\mathcal{M})=\sum_{l=1}^kW(e_{i_l})uvu到v的最短路P\mathcal{P}是指滿足下述條件的路W(P)=min{W(M)Muv}W(\mathcal{P})=min\{W(\mathcal{M})|\mathcal{M}爲從u到v的路\}
如果每條邊的權函數值爲1,則帶權圖的路長與一般圖的路長是一致的。

5.2 DijkstraDijkstra算法

假定給定帶權圖GG,要求GG中從v0v_0vv的最短路徑,DijkstraDijkstra算法的基本思想是:

  1. 將圖G中結點結合VV分成兩部分:
    • 一部分稱爲P具有P標號的集合,結點aaPP標號是指從v0v_0aa的最短路的路長;
    • 另一部分稱爲T具有T標號的集合,結點bbTT標籤是指從v0v_0bb的某條路徑的長度。
  1. DijkstraDijkstra算法中首先將v0v_0取爲P標號結點,其餘的結點均爲T標號結點;
  2. 然後逐步地將具有TT標號的結點改爲PP標號結點,當結點vv被改爲PP標號時,則找到了從v0v_0vv的一條最短路徑。

DijkstraDijkstra算法的步驟:

  1. 先給v0v_0一個PP標號,v0v_0PP標號d(v0)=0d(v_0)=0,並且P={v0}P=\{v_0\};對於viT=VPv_i \in T=V\setminus PTT標號,它們的TT標號按下式確定:
    d(vi)={W(v0,vi),(v0,vi)E,(v0,vi)Ed(v_i)=\begin{cases}W(v_0,v_i),&若(v_0,v_i)\in E\\\infty,&若(v_0,v_i)\notin E \end{cases}

  2. (1)尋找具有最小TT標號的結點。假設最小TT標號的結點爲v1v_1,則將v1v_1TT標號改爲PP標號,並且P=P{v1}P=P\cup \{ {v_1}\};(2)修改與v1v_1相鄰的結點的T標號,即對viT=Tv1v_i\in T=T\setminus {{v_1}}按下式修改:d(vi)={d(v1)+W(v1,vi),d(v1)+W(v1,vi)<d(vi)d(vi),d(v_i)=\begin{cases}d(v_1)+W(v_1,v_i),&若d(v_1)+W(v_1,v_i)<d(v_i)\\d(v_i),&否則\end{cases}

  3. 反覆上述過程,直到vv爲P標號爲止。

將上述過程形式化,就得到DijkstraDijkstra算法,PythonPython僞碼:

# 初始化
V = ['v0','v1','v2','v3']//定義V結點列表
E = [('v0','v1'),('v1','v3'),('v2','v3'),('v0','v2')]//定義邊列表
P = ['v0']//設置P標號
T = []//設置T標號
v = 'v3'
for v in V:
	if v not in P:
		T.append(v)
# 定義權重函數
def W(p,t):
	pass
d('v0') = 0
for t in T:# 首先設置所有具有T標號的節點設置爲1000(類似無窮)
	d(t) = 1000
t0 = ''# 用來存儲將要從T中放到P中的結點
# 第一步
if t0 != v:
	for t in T:# 其次將所有具有T標號的結點中與v0相連的結點取權值W(p,t)。
		d(t) = min{d(t),d('v0')+W('v0',t)}
	for t in T:
		if d(t) is min in T:
			t0 = t
	# 第二步
	P.append(t0)
	T.remove(t0)
else:
	print('這就是Dijkstra路徑',P)

六、EulerEuler

6.1 EulerEuler圖的定義

經常遇到比如去旅遊總不會想走重複的路,或者送貨的時候怎麼避免走重複的路。比較經典的問題:

  1. KonigsbergKonigsberg七橋問題
  2. 計算機鼓輪問題
  3. 筆畫問題
  4. 中國郵路問題

定義23:G=(V,E)G=(V,E)無相連通圖

  1. 若存在一條路,此路通過GG每條邊一次且僅一次,則稱此圈爲EulerEuler;
  2. 若存在一圈,此圈通過GG每條邊一次且僅一次,則稱此圈爲EulerEuler
  3. GG中有EulerEuler圈,則稱GGEulerEuler

定理7:G=(V,E)G=(V,E)是無向連通圖,那麼G是Euler圖的充要條件是G中每個結點都是偶結點

推論7.1:GG爲無向連通圖,GG中具有EulerEuler路的充要條件是GG中恰有兩個奇結點

定義24:G=(V,E)G=(V,E)是一無向圖,eEe \in E,若W(Ge)>W(G)W(G\setminus e)>W(G),則稱eeGG割邊,其中W(G)W(G)表示GG的連通支數。

6.2 FleuryFleury 算法

如何在恰有兩個奇結點的連通圖中尋找EulerEuler路,可參考下面的方法。
FleuryFleury 算法:從一個奇結點出發,按下面步驟走一條路到另一個奇結點。

  1. 從一個奇結點出發,每走一邊抹去一邊;
  2. 在走邊的過程中,除非沒有其他選擇時才走割邊。

6.3 有向圖的EulerEuler

定理8:一個有向圖有EulerEuler必須且只須(1)此圖是連通的(強連通),並且每個結點的入度等於出度;或2(2)最多隻有兩個結點例外,它們中一個結點的入度比出度多1,另一結點的出度比入度多1。

定理9:一個有向圖有EulerEuler圈,必須且只須此圖是連通的,且每個結點的入度等於出度。

定理10:CC是帶權圖GG的一條包含GG中各邊的圈,則CC具有最小長度的充要條件是:

  1. 每條邊最多重複一次;
  2. 在G的每個初級圈上,有重複邊的長度只和不超過圈長的一半。

七、HamiltonHamilton

7.1 HamiltonHamilton圖的定義

上面是討論:一個圖是否有通過圖中每條一次且僅一次的路或圈的問題;
下面將討論:圖中是否存在通過每個結點一次且僅一次的路和圈的問題。

HamiltonHamilton圖是由HamiltonHamilton爵士提出的周遊世界問題,所構建的圖算法模型:
一個正十二面體,有二十個頂點,看做20個城市,能否找到一條旅遊線路線,使得由任意一個城市出發,沿着交通線經過每個城市一次且恰好一次,然後回到出發地?
在這裏插入圖片描述

7.1.1 HamiltonHamilton圖的定義

定義25:G=(V,E)G=(V,E)無向連通圖

  1. 若存在一條路,此路經過GG中每個結點一次且僅一次,則稱此路爲HamiltonHamilton路,記作H-路;
  2. 若存在一圈,此圈經過GG中每個結點一次且僅一次,則稱此圈爲HamiltonHamilton圈(又叫HamiltonHamilton迴路),記作,H-圈;
  3. 若G中有H-圈,則稱G爲HamiltonHamilton圖。

7.1.2 HamiltonHamilton圖的必要條件

定理11:GGHamiltonHamilton圖,則對於集合VV的任一非空子集SS,均有W(GS)SW(G\setminus S)\leq |S|其中S|S|表示集合的結點數,W(G)W(G)表示G的連通支數;GSG\setminus S 表示在G中刪除S中的結點以及以S中的點爲端點的所有邊而剩下的圖;W(GS)W(G\setminus S)表示圖GSG\setminus S的連通支。

證明
\hspace{1cm}CCGG中的HamiltonHamilton圈,因爲在迴路中,依次刪去一結點及與此結點相鄰的兩條邊(圖G刪掉一點,肯定要刪掉任何與之相關聯的邊),每次最多隻增加一個分支,所以W(CS)SW(C\setminus S)\leq |S|,
\hspace{1cm}即類似於一個圈我切上一段,而S中有幾個結點我就切幾段,每段中包含這個結點以及與此結點相連的;
在這裏插入圖片描述
由於CSC\setminus SGSG\setminus S的一個生成子圖,因此W(GS)W(CS)W(G\setminus S)\leq W(C\setminus S),W(GS)SW(G\setminus S)\leq |S|

7.1.3 HamiltonHamilton圖的充分條件

定理12:G=(V,E)G=(V,E)是具有nn個結點的簡單無向圖,若對任意的u,vV,u,v\in V,均有deg(u)+deg(v)n1deg(u)+deg(v)\geq n-1GG中必有一條HH-路。

定理13:G=(V,E)G=(V,E)是具有nn個結點的簡單無向圖,若對任意的u,vV,u,v\in V,均有deg(u)+deg(v)ndeg(u)+deg(v)\geq nGG中必有一條HH-路。

定義26:完全圖的定向圖稱爲競賽圖

定理14:G=(V,E)G=(V,E)是一個競賽圖,V=n|V|=n,則GG中必有一條 HH-路。

八、二分圖

8.1 二分圖的定義

定義27:G=(V,E)G=(V,E)簡單無向圖,如果存在VV的一個劃分V=V1V2V=V_1 \cup V_2,使得GG中每一條邊的一個端點在V1V_1中,另一端點在V2V_2中,則稱GG二分圖,稱V1,V2V_1,V_2VV互補結點子集

\hspace{1cm}特別,當V1V_1中的每一個結點都與V2V_2中的每一個結點鄰接時,稱此圖爲完全二分圖。若V1=m,V2=n,|V_1|=m,|V_2|=n,則將此完全二分圖記作Km,nK_{m,n}

e.g.:e.g.:
在這裏插入圖片描述

如圖所示的是一個完全二分圖,其中V1={v1,v2,v3},V2={v4,v5,v6},V_1=\{v_1,v_2,v_3\},V_2=\{v_4,v_5,v_6\},此圖記作K3,3K_{3,3}

8.2 二分圖的充要條件

定理15:G=(V,E)G=(V,E)爲簡單無向圖,GG爲二分圖的充要條件是GG中每一個圈的長度都是偶數。

定義28:G=(V,E)G=(V,E)是二分圖,EV1×V2E\subseteq V_1\times V_2。若MEM\subset E,且M中任何兩條邊不相鄰,則稱M是G的一個匹配;具有邊數最多的匹配稱爲最大匹配;若V1=V2=M,|V_1|=|V_2|=|M|,則稱M爲完美匹配,匹配M中的邊eMe\in M稱爲

九、平面圖

9.1 平面圖的定義

十、樹

10.1 自由樹

定義32:G=(V,E)G=(V,E)是一個無向圖,若G是連通的且無圈,則稱G是一棵自由樹。樹中的邊稱爲樹枝;若deg(v)=1deg(v)=1,稱vv葉子,否則稱爲分支點

以下皆是樹:
在這裏插入圖片描述
定理18:G=(V,E)G=(V,E)(n,m)(n,m)無向圖,那麼下面的六種說法是等價的:

  1. G是一棵樹;
  2. G的每一對結點間有且只有一條路;
  3. G是連通的且m=n1m=n-1
  4. G是無圈的且m=n1m=n-1
  5. G是無圈的但若在G的任一對結點間加一邊時,恰形成一圈;
  6. G是連通的但若在G中任意刪除一邊時,恰成爲兩個連通支。

定義33:G=(V,E)G=(V,E)是無向圖,若G是無圈的,則稱G是一個森林。
可以看到,若G爲森林,則G的每個連通支爲一棵樹,如下圖所示就是一個森林。
在這裏插入圖片描述

10.2 生成樹

定義34:G=(V,E)G=(V,E)是一個無向圖,T=(V,E~)T=(V,\widetilde E)GG的一個生成子圖,若TT是一棵樹,則稱T爲G的一棵生成樹

生成子圖不一定是連通的,生成樹是聯通的。

定理19:G=(V,E)G=(V,E)是一個無向圖,GG存在生成樹的充要條件是GG爲連通圖。

定理20:G=(V,E)G=(V,E)是一連通圖,V=n|V|=n,那麼GG的生成子圖T=(V,E~)T=(V,\widetilde E)是一生成樹的充要條件是:TT連通且E~=n1|\widetilde E|=n-1

10.3 最小生成樹

10.3.1 最小生成樹的定義

定義35:G=(V,E,W)G=(V,E,W)是一帶權圖,若T={e1,e2,...,en1}T=\{e_1,e_2,...,e_{n-1}\}GG的一棵生成樹,定義W(T)=i=1n1W(ei)W(T)=\sum_{i=1}^{n-1}W(e_i),若T0T_0GG的一棵生成樹,W(T0)=min{W(T)T}W(T_0)=min\{W(T)|T是生成樹\},稱T0T_0GG的最小生成樹。
eie_i表示邊。
下面介紹求最小生成樹的算法。

10.3.2 KruskalKruskal算法(避圈法推廣):

  1. GG中各邊按權值由小到大排隊e1,e2,...,em(i<jW(ei)W(ej))e_1,e_2,...,e_m(i<j\Rightarrow W(e_i)\leq W(e_j))
  2. i:=1,k:=1,T:={e1};i:=1,k:=1,T:=\{e_1\};
  3. k:=k+1k:=k+1,若T{ek}T\cup \{e_k\}無圈,則i:=i+1,T:=T{ek}i:=i+1,T:=T\cup \{e_k\},轉向4,否則轉向3;
  4. i=n1i=n-1,出口;否則轉向3。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章