一、圖的基本概念
1.1 圖的定義
定義1 :圖 G = ( V , E ) G=(V,E) G = ( V , E ) 是一個系統,其中V是非空有限集合,V中的元素稱爲結點;E是有限集合,E中的元素稱爲邊;且E中的元素與V中的一對元素相連繫。
例1:有四個城市v 1 , v 2 , v 3 , v 4 v_{1},v_{2},v_{3},v_{4} v 1 , v 2 , v 3 , v 4 ,其中v 1 與 v 2 v_{1}與v_{2} v 1 與 v 2 ,v 1 與 v 4 v_{1}與v_{4} v 1 與 v 4 ,v 2 與 v 3 v_{2}與v_{3} v 2 與 v 3 有公路相連。
答:上述事實可用圖G = ( V , E ) G=(V,E) G = ( V , E ) 表示。圖中結點集合V = {v 1 , v 2 , v 3 , v 4 v_1,v_2,v_3,v_4 v 1 , v 2 , v 3 , v 4 },圖中邊的集合E = {v 1 與 v 2 之 間 的 邊 , v 1 與 v 4 之 間 的 邊 , v 2 與 v 3 之 間 的 邊 v_1與v_2之間的邊,v_1與v_4之間的邊,v_2與v_3之間的邊 v 1 與 v 2 之 間 的 邊 , v 1 與 v 4 之 間 的 邊 , v 2 與 v 3 之 間 的 邊 }
例2:有四個程序,他們之間存在如下的調用關係:P 1 能 調 用 P 2 , P 2 能 調 用 P 3 , P 2 能 調 用 P 4 P_1能調用P_2,P_2能調用P_3,P_2能調用P_4 P 1 能 調 用 P 2 , P 2 能 調 用 P 3 , P 2 能 調 用 P 4 。
答:上述事實也可用圖G = ( V , E ) G=(V,E) G = ( V , E ) 表示。圖中結點集合V = {P 1 , P 2 , P 3 , P 4 P_1,P_2,P_3,P_4 P 1 , P 2 , P 3 , P 4 },圖中邊的集合E = {P 1 到 P 2 的 邊 , P 2 到 P 3 的 邊 , P 2 到 P 4 的 邊 P_1到P_2的邊,P_2到P_3的邊,P_2到P_4的邊 P 1 到 P 2 的 邊 , P 2 到 P 3 的 邊 , P 2 到 P 4 的 邊 }
定義2 :圖G = ( V , E ) G=(V,E) G = ( V , E ) 是一個系統,其中V是非空有限集合,V中的元素稱爲結點;E是集合V上的關係E ⊆ V × V E \subseteq V \times V E ⊆ V × V ,E中的元素稱爲邊。
例3:同例1,例2。
答:例1可表示爲:V = {v 1 , v 2 , v 3 , v 4 v_1,v_2,v_3,v_4 v 1 , v 2 , v 3 , v 4 },E = {( v 1 , v 2 ) , ( v 2 , v 1 ) , ( v 1 , v 4 ) , ( v 4 , v 1 ) , ( v 2 , v 3 ) , ( v 3 , v 2 ) (v_1,v_2),(v_2,v_1),(v_1,v_4),(v_4,v_1),(v_2,v_3),(v3_,v_2) ( v 1 , v 2 ) , ( v 2 , v 1 ) , ( v 1 , v 4 ) , ( v 4 , v 1 ) , ( v 2 , v 3 ) , ( v 3 , v 2 ) }。
例2 可表示爲:V = { P 1 , P 2 , P 3 , P 4 } , E = { ( P 1 , P 2 ) , ( P 2 , P 3 ) , ( P 2 , P 4 ) } V = \{P_1,P_2,P_3,P_4\},E = \{(P_1,P_2),(P_2,P_3),(P_2,P_4)\} 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 ∑ 是一個標號集合,E ⊆ V × ∑ × V E \subseteq V \times \sum \times V E ⊆ V × ∑ × V , 稱 G = ( V , ∑ , E ) G = (V, \sum, E) G = ( V , ∑ , E ) 爲一個圖。稱V中的元素爲G的結點;設 u , v ∈ V u, v \in V u , v ∈ V , σ ∈ ∑ \sigma \in \sum σ ∈ ∑ , 若( u , σ , v ) ∈ E (u,\sigma,v)\in E ( u , σ , v ) ∈ E ,則稱( u , σ , v ) (u,\sigma,v) ( u , σ , v ) 爲G中的一條邊,此邊起自於u終止與v;稱u爲邊( u , σ , v ) (u,\sigma,v) ( u , σ , v ) 的起點,v爲邊( u , σ , v ) (u,\sigma,v) ( u , σ , v ) 的重點,起點或終點統稱爲邊( u , σ , v ) (u,\sigma,v) ( u , σ , v ) 的端點。
定義4 :圖G = ( V , E ) G=(V,E) G = ( V , E ) 是一個系統。其中V是結點的非空有限集合;E是邊的有限集合;γ \gamma γ 是邊到結點集的一個關聯函數,即 γ : E → 2 V \gamma:E \to 2^V γ : E → 2 V 。一般來說,它將E中的每條邊 e ∈ E e \in E e ∈ E 與結點集V中的一個二元子集 { u , v } ∈ 2 V \{u,v\} \in 2^V { u , v } ∈ 2 V 相關聯,即 γ ( e ) = { u , v } \gamma(e) = \{u,v\} γ ( e ) = { u , v } ,結點u和v統稱爲邊e的端點。
1.2 圖的常見類型
對圖的定義一般採用定義2的方式,並將擁有n個結點,m條邊的圖稱爲(n,m)圖。
設G = ( V , ∑ , E ) G = (V,\sum,E) G = ( V , ∑ , E ) ,圖的類型一般有:
無向圖 :在圖G中,若( u , σ , v ) (u,\sigma,v) ( u , σ , v ) 與( v , σ , u ) (v,\sigma,u) ( v , σ , u ) 表示同一條邊,則稱此邊爲無向邊;若G中所有邊都是無向邊,則稱G爲無向圖
有向圖 :若G中所有邊都是有向邊,則稱G爲有向圖。
混合圖 :若G中,既有有向邊,又有無向邊,則稱這種圖爲混合圖。
零圖 :若在圖G中E = ∅ \emptyset ∅ ,則稱G爲零圖。
平凡圖 :稱只有一個結點的圖爲平凡圖。
設G = ( V , ∑ , E ) G = (V,\sum,E) G = ( V , ∑ , E ) ,邊與邊,結點與邊,結點與結點之間的關係一般有:
邊鄰接 :若G中有兩條邊有一個公共端點,則稱此二邊鄰接。
結點相鄰 :若G中的兩個結點是同一條邊上的兩個端點,則稱此二結點相鄰。
關聯 :若G中的節點v是邊e的端點,則稱節點v與邊e相關聯。
孤立點 :不與任何邊相關聯的點稱爲孤立點。
自環 :關聯於同一節點的一條邊稱爲自環。
在圖G中,邊的關係一般有:
平行邊 :若兩條邊有相同的端點(對有向圖則有相同的起點和終點),則稱此二邊爲平行邊。
重數 :兩節點之間平行邊的條數成爲平行邊的重數。
多重圖 :若圖G中有平行邊存在,則稱此圖爲多重圖。
簡單圖 :若圖G中無平行邊且無自環,則稱圖G爲簡單圖。
1.3 子圖與補圖
定義5 :設G = ( V , E ) G=(V,E) G = ( V , E ) 爲簡單圖,若G中每一對不同的結點間都有邊相連,則稱G爲完全圖。
設G有n個結點,m條邊。當G爲無向完全圖是,則有m = n(n-1)/2;當G爲有向完全圖時,則有m = n(n-1)。一般將n個節點的無向完全圖記爲K n K_n K n 。
定義6 :設有圖G= (V,E)和圖G ‘ = ( V ‘ , E ‘ ) G^` = (V^`,E^`) G ‘ = ( V ‘ , E ‘ )
子圖 :若V ‘ ⊆ V V^` \subseteq V V ‘ ⊆ V , E ‘ ⊆ E E^` \subseteq E E ‘ ⊆ E ,則稱G ‘ G^` G ‘ 爲G的子圖。
真子圖 :若V ‘ ⊂ V V^` \subset V V ‘ ⊂ V , E ‘ ⊂ E E^`\subset E E ‘ ⊂ E ,則稱G ‘ G^` G ‘ 爲G的真子圖。
生成子圖(又稱支撐子圖) :V ‘ = V V^` = V V ‘ = V , E ‘ ⊆ E E^`\subseteq E E ‘ ⊆ E ,則稱G ‘ G^` G ‘ 爲G的生成子圖。
平凡子圖 :V ‘ = V V^` = V V ‘ = V , E ‘ = E E^` = E E ‘ = E 或 V ‘ = V V^` = V V ‘ = V , E ‘ = ∅ E^` = \emptyset E ‘ = ∅ ,稱這兩個子圖爲平凡子圖。
定義7 :設G = ( V , E ) G=(V,E) G = ( V , E ) 爲一簡單圖,G ∗ = ( V , E ∗ ) G^* = (V,E^*) G ∗ = ( V , E ∗ ) 爲完全圖,稱 G ‾ = ( V , E ‾ ) \overline{G} = (V,\overline{E}) G = ( V , E ) 爲G的補圖,其中 E ‾ = E ∗ \overline{E} = E^* E = E ∗ \ E E E .
定義8 :設G = ( V , E ) G=(V,E) G = ( V , E ) 是圖,
當G爲有向圖時,G中以v爲起點的邊的條數成爲v的出度,記爲d e g ← ( v ) \overleftarrow{deg}(v) d e g ( v ) ;以v爲終點的邊的條數成爲v的入度,記爲d e g → ( v ) \overrightarrow{deg}(v) d e g ( v ) ;入度和出度之和成爲v的度,記爲d e g ( v ) deg(v) d e g ( v ) 。
當G爲無向圖時,以v爲端點的邊的條數稱爲v的度,記爲d e g ( v ) deg(v) d e g ( v ) 。
當某節點的度數爲奇數,稱此結點爲奇結點 ;若結點的度數爲偶數,則稱此節點爲偶結點 ;
稱度數爲1的節點爲懸掛點 ,與懸掛點關聯的邊稱爲懸掛邊 。
定理1 :設G = ( V , E ) G=(V,E) G = ( V , E ) 是(n,m)無向圖,則∑ i = 1 n d e g ( v i ) = 2 m \sum_{i=1}^n{deg(v_i)} = 2m ∑ i = 1 n d e g ( v i ) = 2 m 。
定理2 :設G = ( V , E ) G=(V,E) G = ( V , E ) 是(n,m)有向圖,則∑ i = 1 n d e g ← ( v i ) = ∑ i = 1 n d e g → ( v i ) = m \sum_{i=1}^n{\overleftarrow{deg}(v_i)} = \sum_{i=1}^n{\overrightarrow{deg}(v_i)} = m ∑ i = 1 n d e g ( v i ) = ∑ i = 1 n d e g ( v i ) = m 。
定理3 :設G = ( V , E ) G=(V,E) G = ( V , E ) 是(n,m)無向圖,則奇結點的個數爲偶數。
二、圖的同構
1.1 圖的同構的定義
定義9 :設G = ( V , E ) G=(V,E) G = ( V , E ) 和G ‘ = ( V ‘ , E ‘ ) G^`=(V^`,E^`) G ‘ = ( V ‘ , E ‘ ) 是兩個簡單無向圖,若存在從V到V ‘ V^` V ‘ 的雙射函數h,使得e = { v i , v j } ∈ E e = \{v_i,v_j\} \in E e = { v i , v j } ∈ E 當且僅當e ‘ = { h ( v i ) , h ( v j ) } ∈ E ‘ e^` = \{h(v_i),h(v_j)\}\in E^` e ‘ = { h ( v i ) , h ( v j ) } ∈ E ‘ ,則稱圖G與圖G ‘ G^` G ‘ 同樣。
必要條件(不是充分條件):
結點數相等;
邊數相等;
度數相同的結點個數相等。
注意同構是一個等價關係、
定義10 :設G = ( V , E ) G=(V,E) G = ( V , E ) 和G ‘ = ( V ‘ , E ‘ ) G^` = (V^`,E^`) G ‘ = ( V ‘ , E ‘ ) 是兩個簡單有向圖,若存在從V到V ‘ V^` V ‘ 的雙射函數h,使得e = { v i , v j } ∈ E e = \{v_i,v_j\} \in E e = { v i , v j } ∈ E 當且僅當e ‘ = { h ( v i ) , h ( v j ) } ∈ E ‘ e^` = \{h(v_i),h(v_j)\}\in E^` e ‘ = { h ( v i ) , h ( v j ) } ∈ E ‘ ,則稱圖G與圖G ‘ G^` G ‘ 同構。
三、路與圈
3.1 路與圈的定義
定義11 :設G = ( V , E ) G=(V,E) G = ( V , E ) ,W是G的有限非空點邊交錯序列 W = v 0 e 1 v 1 e 2 v 2 … e k v k W = v_0e_1v_1e_2v_2…e_kv_k W = v 0 e 1 v 1 e 2 v 2 … e k v k 稱W爲G的一條從v 0 v_0 v 0 到v k v_k v k 的途徑,稱v 0 v_0 v 0 爲途徑的起點,v k v_k v k 爲途徑的終點,k爲途徑的長度。
定義12 :在途徑W中,如v 0 ≠ v k v_0 \not= v_k v 0 = v k ,則稱W是從v 0 v_0 v 0 到v k v_k v k 的一條路;若v 0 = v k v_0 = v_k v 0 = v k ,則稱W是圈。
定義13 :無重複邊的路稱爲簡單路,無重複邊的圈稱爲簡單圈,無重複點的路稱爲初級路,無重複點的圈稱爲初級圈。
定理4 :設G = ( V , E ) G=(V,E) G = ( V , E ) 爲一簡單圖,|V| = n,則:
G中任一初級路的長度不超過n-1;
G中任一初級圈的長度不超過n。
3.2 路與圈的可達性
定義14 :設G = ( V , E ) G=(V,E) G = ( V , E ) 是圖,任取u,v ∈ \in ∈ V,如果G中存在一條從u到v的路,則稱u可達v。(規定u到自己總是可達的)
無向圖中,從u可達v,很明顯,v可達u成立;
然而有向圖中,u可達v,v不一定可達u。所以規定:u , v 相 互 可 達 ↔ u 可 達 v ∧ v 可 達 u u,v相互可達 \leftrightarrow u可達v \wedge v可達u u , v 相 互 可 達 ↔ u 可 達 v ∧ v 可 達 u 。
從u可達v的所有路中最短的那一條稱爲短程線 (短線程不一定是唯一的)。並經短程線的長度叫做從u到v的距離,用d ( u , v ) d(u,v) d ( u , v ) 表示。規定:
d ( u , v ) = 0 d(u,v)=0 d ( u , v ) = 0 ;
若u到v不可達,則d ( u , v ) = ∞ d(u,v)=\infty d ( u , v ) = ∞
3.3 圖的連通性
3.3.1 無向圖的連通性
定義15 :設G = ( V , E ) G=(V,E) G = ( V , E ) 是無向圖 ,如果G中任意兩結點間均可達,則稱圖G是連通的,即G是連通圖,否則稱圖G是非連通的,即G是非連通圖。
極大連通子圖 :對於無向圖(並不一定是連通的),如果是連通圖,那自己就是極大連通子圖;如果是非連通圖,則必然有獨立出來的路或圈,而將這些部分按照相互不連通,進行劃分,每一個劃分塊都是給定圖的一個連通子圖,而在每一個劃分塊中結點間的可達性已達到極大限度。
定義16 :設G = ( V , E ) G=(V,E) G = ( V , E ) 爲無向圖 ,G的一個極大連通子圖稱爲G的一個連通支 。(非連通無向圖中一般連通支數 ≥ \geq ≥ 2。)
3.3.2 有向圖的連通性
定義17 :設G = ( V , E ) G=(V,E) G = ( V , E ) 爲有向圖 ,
若G中任意兩結點間都是相互可達的,則稱G是強連通 的;
若G中任意兩結點間至少有一結點可到達另一結點,則稱G是單連通的 ;
若略去邊的方向後,G的無向圖時連通的,則稱G是弱連通 的。
(弱連通,可能既不是單連通的,也不是強聯通的;強聯通一定是單連通和弱連通的;單連通一定是弱連通的,但不一定是強聯通的。)
定義18 :設G = ( V , E ) G=(V,E) G = ( V , E ) 是簡單有向圖 ,稱G的極大的強連通子圖爲G的強連通支;稱G的極大的單向連通子圖爲G的一個單向連通支;稱G的極大的若連通子圖爲G的一個若連通支。(注意:提到強,單向,弱就是有向圖)
有向圖的強連通性及弱連通性建立了G中節點集合V上的等價關係,即有向圖強/弱連通性都可以通過結點集合V來表示,但兩者還是有區別的。
對弱連通 ,不僅建立了結點集上的劃分,而且還建立了邊集上的劃分。
設$G_1,G_2,…,G_k,爲G的所有弱連通支,則有:
V ( G 1 ) ∪ V ( G 2 ) ∪ . . . ∪ V ( G k ) = V ( G ) E ( G 1 ) ∪ E ( G 2 ) ∪ . . . ∪ E ( G k ) = 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}
V ( G 1 ) ∪ V ( G 2 ) ∪ . . . ∪ V ( G k ) = V ( G ) E ( G 1 ) ∪ E ( G 2 ) ∪ . . . ∪ E ( G k ) = E ( G )
當i ≠ j i \not= j i = j 時,有:
V ( G i ) ∩ V ( G j ) = ∅ E ( G i ) ∩ E ( G j ) = ∅
\begin{matrix}
V(G_i) \cap V(G_j) = \emptyset \\
E(G_i) \cap E(G_j) = \emptyset \\
\end{matrix}
V ( G i ) ∩ V ( G j ) = ∅ E ( G i ) ∩ E ( G j ) = ∅
對強連通 ,只能建立結點集上的劃分,而不能建立邊集上的劃分。
設$G_1,G_2,…,G_k,爲G的所有強連通支,則有:
V ( G 1 ) ∪ V ( G 2 ) ∪ . . . ∪ V ( G k ) = V ( G ) E ( G 1 ) ∪ E ( G 2 ) ∪ . . . ∪ E ( G k ) ⊆ 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}
V ( G 1 ) ∪ V ( G 2 ) ∪ . . . ∪ V ( G k ) = V ( G ) E ( G 1 ) ∪ E ( G 2 ) ∪ . . . ∪ E ( G k ) ⊆ E ( G )
當i ≠ j i \not= j i = j 時,有V ( G i ) ∩ V ( G j ) = ∅ V(G_i) \cap V(G_j) = \emptyset V ( G i ) ∩ V ( G j ) = ∅
定理5:在簡單有向圖 G = ( V , E ) G=(V,E) G = ( V , E ) 中:
每一個結點及每一條邊恰在一個弱連通中;
每一個結點恰在一個強連通支中;
每一個結點,每一條邊至少屬於一個單向連通支。
四、圖的矩陣表示
4.1 鄰接矩陣
4.1.1 鄰接矩陣的定義及強行命名
定義19 :設G = ( V , E ) G=(V,E) G = ( V , E ) 是簡單有向圖 ,V = v 1 , v 2 , . . . , v n V={v_1,v_2,...,v_n} V = v 1 , v 2 , . . . , v n 被強行命名,稱n階方陣A = ( a i j ) n × n A = (a_{ij})_{n \times n} A = ( a i j ) n × n 爲G的鄰接矩陣 。其中:
a i j = { 1 , ( v i , v j ) ∈ E 0 , ( v i , v j ) ∉ E
a_{ij}=\begin{cases}
1,&(v_i,v_j) \in E \\ 0,&(vi,vj) \notin E
\end{cases}
a i j = { 1 , 0 , ( v i , v j ) ∈ E ( v i , v j ) ∈ / E
定義中的強行命名 是指:給V V V 中的各結點從v 1 到 v n v_1到v_n v 1 到 v n 確定一個排隊的次序。當強行命名改變時,即結點次序改變,圖的鄰接矩陣也會變化。
對於一個給定的圖,我們能用一個主對角線全爲零的方陣將結點間的鄰接關係反應出來;
對於一個對角線全爲零、元素爲0或1的方陣,我們可以將其表示成一個圖。
若圖G 1 與 G 2 G_1與G_2 G 1 與 G 2 同構,則它們相對應的鄰接矩陣A ( G 1 ) 與 A ( G 2 ) A(G_1)與A(G_2) A ( G 1 ) 與 A ( G 2 ) 或者相同,或者其中的一個通過行與列的交換能轉換成另一個。
零圖:鄰接矩陣元素全是零;
完全圖:除對角線上全是零外,其餘元素均爲1;
圖對稱:鄰接矩陣按主對角線對稱,即A = A T A = A^{T} A = A T
4.1.2 利用鄰接矩陣求各結點的入度和出度
如:
A = [ 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 ]
A = \begin{bmatrix}
0&1&0&0\\
0&0&1&1\\
1&1&0&1\\
1&0&0&0
\end{bmatrix}
A = ⎣ ⎢ ⎢ ⎡ 0 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 ⎦ ⎥ ⎥ ⎤
a i j a_{ij} a i j 表示邊( v i , v j ) (v_i,v_j) ( v i , v j ) ,取值決定這條邊是否存在。
d e g ← ( v i ) = a i 1 + a i 2 + . . . + a i n = ∑ k = 1 n a i k d e g → ( v i ) = a 1 i + a 2 i + . . . + a n i = ∑ k = 1 n a i k d e g ( v i ) = ∑ k = 1 n ( a i k + a k i )
\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})
d e g ( v i ) = a i 1 + a i 2 + . . . + a i n = k = 1 ∑ n a i k d e g ( v i ) = a 1 i + a 2 i + . . . + a n i = k = 1 ∑ n a i k d e g ( v i ) = k = 1 ∑ n ( a i k + a k i )
試:根據矩陣A,計算結點v 2 v_2 v 2 的度數:
結點v 2 v_2 v 2 的出度 (以v 2 v_2 v 2 爲起點的邊的條數):
d e g ← ( v 2 ) = a 21 + a 22 + a 23 + a 24 = 2 \overleftarrow{deg}(v_2)=a_{21}+a_{22}+a_{23}+a_{24}=2 d e g ( v 2 ) = a 2 1 + a 2 2 + a 2 3 + a 2 4 = 2
結點v 2 v_2 v 2 的入度 (以v 2 v_2 v 2 爲終點的邊的條數):
d e g → ( v 2 ) = a 12 + a 22 + a 32 + a 42 = 2 \overrightarrow{deg}(v_2)=a_{12}+a_{22}+a_{32}+a_{42}=2 d e g ( v 2 ) = a 1 2 + a 2 2 + a 3 2 + a 4 2 = 2
d e g ( v 2 ) = d e g ← ( v 2 ) + d e g → ( v 2 ) = 4 {deg}(v_2)=\overleftarrow{deg}(v_2)+\overrightarrow{deg}(v_2)=4 d e g ( v 2 ) = d e g ( v 2 ) + d e g ( v 2 ) = 4
4.1.3 鄰接矩陣中A A T AA^T A A T 與A T A A^TA A T A 中元素的含義
形如:
B = A A T , b i j = ∑ k = 1 n ( a i k ⋅ a k j T ) = ∑ k = 1 n ( a i k ⋅ a j k ) ; B = AA^T,\\b_{ij} = \sum_{k=1}^{n}({a_{ik} \cdot a_{kj}^T})=\sum_{k=1}^{n}(a_{ik}\cdot a_{jk}); B = A A T , b i j = k = 1 ∑ n ( a i k ⋅ a k j T ) = k = 1 ∑ n ( a i k ⋅ a j k ) ;
注意a k j T 就 是 a k j a_{kj}^T 就是 a_{kj} a k j T 就 是 a k j ,而且普遍情況下:a k j T ≠ a j k a_{kj}^T \not= a_{jk} a k j T = a j k ,之所以上面的b i j b_{ij} b i j 的公式成立,是因爲這是矩陣A A A 乘以矩陣自身的轉置A T A^T A T 運算的規律。
如:
A = [ 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 ] ,
A = \begin{bmatrix}
0&1&0&0\\
0&0&1&1\\
1&1&0&1\\
1&0&0&0
\end{bmatrix},
A = ⎣ ⎢ ⎢ ⎡ 0 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 ⎦ ⎥ ⎥ ⎤ ,
B = [ 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 ] ⋅ [ 0 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 ] = [ 1 0 1 0 0 2 1 1 1 1 3 1 0 0 1 1 ]
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}
B = ⎣ ⎢ ⎢ ⎡ 0 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 ⎦ ⎥ ⎥ ⎤ ⋅ ⎣ ⎢ ⎢ ⎡ 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 ⎦ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎡ 1 0 1 0 0 2 1 0 1 1 3 1 0 1 1 1 ⎦ ⎥ ⎥ ⎤
b 11 = 1 b_{11}=1 b 1 1 = 1 是相當於:( v 1 不 可 達 v 1 ∩ v 1 不 可 達 v 1 ) ∪ ( v 1 可 達 v 2 ∩ v 1 可 達 v 2 ) ∪ ( v 1 不 可 達 v 3 ∩ v 1 不 可 達 v 3 ) ∪ ( v 1 不 可 達 v 4 ∩ v 1 不 可 達 v 4 ) = 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; ( v 1 不 可 達 v 1 ∩ v 1 不 可 達 v 1 ) ∪ ( v 1 可 達 v 2 ∩ v 1 可 達 v 2 ) ∪ ( v 1 不 可 達 v 3 ∩ v 1 不 可 達 v 3 ) ∪ ( v 1 不 可 達 v 4 ∩ v 1 不 可 達 v 4 ) = 0 + 1 + 0 + 0 = 1 ;
b 23 = 1 b_{23}=1 b 2 3 = 1 是相當於:( v 2 不 可 達 v 1 ∩ v 3 可 達 v 1 ) ∪ ( v 2 不 可 達 v 2 ∩ v 3 可 達 v 2 ) ∪ ( v 2 可 達 v 3 ∩ v 3 不 可 達 v 3 ) ∪ ( v 2 可 達 v 4 ∩ v 3 可 達 v 4 ) = 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; ( v 2 不 可 達 v 1 ∩ v 3 可 達 v 1 ) ∪ ( v 2 不 可 達 v 2 ∩ v 3 可 達 v 2 ) ∪ ( v 2 可 達 v 3 ∩ v 3 不 可 達 v 3 ) ∪ ( v 2 可 達 v 4 ∩ v 3 可 達 v 4 ) = 0 + 0 + 0 + 1 = 1 ;
b 22 = 2 b_{22}=2 b 2 2 = 2 是相當於:( v 2 不 可 達 v 1 ∩ v 2 不 可 達 v 1 ) ∪ ( v 2 不 可 達 v 2 ∩ v 2 可 達 v 2 ) ∪ ( v 2 可 達 v 3 ∩ v 2 可 達 v 3 ) ∪ ( v 2 可 達 v 4 ∩ v 2 可 達 v 4 ) = 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; ( v 2 不 可 達 v 1 ∩ v 2 不 可 達 v 1 ) ∪ ( v 2 不 可 達 v 2 ∩ v 2 可 達 v 2 ) ∪ ( v 2 可 達 v 3 ∩ v 2 可 達 v 3 ) ∪ ( v 2 可 達 v 4 ∩ v 2 可 達 v 4 ) = 0 + 0 + 1 + 1 = 2 ;
b 33 = 3 b_{33}=3 b 3 3 = 3 是相當於:( v 3 可 達 v 1 ∩ v 3 可 達 v 1 ) ∪ ( v 3 可 達 v 2 ∩ v 3 可 達 v 2 ) ∪ ( v 3 不 可 達 v 3 ∩ v 3 不 可 達 v 3 ) ∪ ( v 3 可 達 v 4 ∩ v 3 可 達 v 4 ) = 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; ( v 3 可 達 v 1 ∩ v 3 可 達 v 1 ) ∪ ( v 3 可 達 v 2 ∩ v 3 可 達 v 2 ) ∪ ( v 3 不 可 達 v 3 ∩ v 3 不 可 達 v 3 ) ∪ ( v 3 可 達 v 4 ∩ v 3 可 達 v 4 ) = 1 + 1 + 0 + 1 = 3 ;
若b i j = 1 b_{ij}=1 b i j = 1 ,則表示存在一個節點v k 0 v_{k_0} v k 0 使,從v i v_i v i 及v j v_j v j 發出的邊都終止於它;如b 23 = 1 , 有 v 2 , v 3 終 止 於 v 4 b_{23}=1,有v_2,v_3終止於v_4 b 2 3 = 1 , 有 v 2 , v 3 終 止 於 v 4 ;
同理,若b i j = 2 b_{ij}=2 b i j = 2 ,則表示存在兩個節點,使從v i v_i v i 及v j v_j v j 發出的邊都終止於它們;
因此,b i j b_{ij} b i j 的值表示了從vi和vj發出的邊終止與同一結點的結點數目。
當i = j i=j i = j 時,B的主對角線上的元素值表示了結點v i v_i v i 的出度 ,即:b i j = ∑ k = 1 n ( a i k ⋅ a i k ) = ∑ k = 1 n a i k = d e g ← ( v i ) b_{ij}=\sum_{k=1}^{n}({a_{ik} \cdot a_{ik}})=\sum_{k=1}^na_{ik}=\overleftarrow{deg}(v_i) b i j = k = 1 ∑ n ( a i k ⋅ a i k ) = k = 1 ∑ n a i k = d e g ( v i )
如:b 11 = 1 b_{11}=1 b 1 1 = 1 是相當於:
( v 1 不 可 達 v 1 ∩ v 1 不 可 達 v 1 ) ∪ ( v 1 可 達 v 2 ∩ v 1 可 達 v 2 ) ∪ ( v 1 不 可 達 v 3 ∩ v 1 不 可 達 v 3 ) ∪ ( v 1 不 可 達 v 4 ∩ v 1 不 可 達 v 4 ) = ( v 1 不 可 達 v 1 ) ∪ ( v 1 可 達 v 2 ) ∪ ( v 1 不 可 達 v 3 ) ∪ ( v 1 不 可 達 v 4 ) = 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}
( v 1 不 可 達 v 1 ∩ v 1 不 可 達 v 1 ) ∪ ( v 1 可 達 v 2 ∩ v 1 可 達 v 2 ) ∪ ( v 1 不 可 達 v 3 ∩ v 1 不 可 達 v 3 ) ∪ ( v 1 不 可 達 v 4 ∩ v 1 不 可 達 v 4 ) = ( v 1 不 可 達 v 1 ) ∪ ( v 1 可 達 v 2 ) ∪ ( v 1 不 可 達 v 3 ) ∪ ( v 1 不 可 達 v 4 ) = 0 + 1 + 0 + 0 = 1 ;
按照同樣的道理:
B = A T A , b i j = ∑ k = 1 n a i k T ⋅ a k j = ∑ k = 1 n a k i ⋅ a k i
B=A^TA,\\
b_{ij}=\sum_{k=1}^{n}a_{ik}^T \cdot a_{kj}=\sum_{k=1}^n a_{ki} \cdot a_{ki}
B = A T A , b i j = k = 1 ∑ n a i k T ⋅ a k j = k = 1 ∑ n a k i ⋅ a k i
b i j b_{ij} b i j 的值表示存在着這些數量的結點使由它們發出的邊同時終止與v i v_i v i 與v j v_j v j 。
當i = j i=j i = j 時,B的主對角線上的元素值表示了結點v i v_i v i 的入度 ,即
b i j = ∑ k = 1 n a i k T ⋅ a k j = ∑ k = 1 n a k i ⋅ a k i = ∑ k = 1 n a k i = d e g → ( v i ) 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)
b i j = k = 1 ∑ n a i k T ⋅ a k j = k = 1 ∑ n a k i ⋅ a k i = k = 1 ∑ n a k i = d e g ( v i )
4.1.4 鄰接矩陣中A n A^n A n 中的元素的意義
當n = 1 n=1 n = 1 時,A 1 = ( a i j 1 ) n × n , a i j = 1 A^1 = (a_{ij}^1)_{n\times n},a_{ij}=1 A 1 = ( a i j 1 ) n × n , a i j = 1 表示存在一條邊( v i , v j ) (v_i,v_j) ( v i , v j ) ,即從v i 到 v j v_i到v_j v i 到 v j 存在一條長度爲1的路。
當n = 2 n=2 n = 2 時,A 2 = ( a i j 2 ) n × n , a i j 2 = ∑ k = 1 n a i k ⋅ a k j , A^2=(a_{ij}^2)_{n\times n},a_{ij}^2=\sum_{k=1}^na_{ik}\cdot a_{kj}, A 2 = ( a i j 2 ) n × n , a i j 2 = ∑ k = 1 n a i k ⋅ a k j ,
a i j 2 = 1 ⇔ ( 僅 ∃ k 0 ) ( a i k 0 = 1 ∧ a k 0 j = 1 ) , a_{ij}^2=1 \Leftrightarrow (僅\exists k_0)(a_{ik_0}=1 \wedge a_{k_0j}=1), a i j 2 = 1 ⇔ ( 僅 ∃ k 0 ) ( a i k 0 = 1 ∧ a k 0 j = 1 ) , 由a i k 0 = 1 及 a k 0 j = 1 a_{ik_0}=1 及 a_{k_0j}=1 a i k 0 = 1 及 a k 0 j = 1 知:存在一條從v i 到 v j v_i到v_j v i 到 v j 的長度爲2的路。
a i j 2 = 2 ⇔ ( 僅 ∃ k 0 , k 1 ) ( a i k 0 = 1 ∧ a k 0 j = 1 ∧ a i k 1 = 1 ∧ a k 1 j = 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), a i j 2 = 2 ⇔ ( 僅 ∃ k 0 , k 1 ) ( a i k 0 = 1 ∧ a k 0 j = 1 ∧ a i k 1 = 1 ∧ a k 1 j = 1 ) , 由a i k 0 = 1 , a k 0 j = 1 , a i k 1 = 1 , a k 1 j = 1 a_{ik_0}=1 , a_{k_0j}=1 , a_{ik_1}=1 , a_{k_1j}=1 a i k 0 = 1 , a k 0 j = 1 , a i k 1 = 1 , a k 1 j = 1 知:存在兩條從v i 到 v j v_i到v_j v i 到 v j 的長度爲2的路。
由此得知:a i j 2 a_{ij}^2 a i j 2 表示由v i 到 v j v_i到v_j v i 到 v j 的長度爲2的不同路的總數;而a i i 2 a_{ii}^2 a i i 2 表示經過v i v_i v i 的長度爲2的圈數。
a i j 2 = 0 a_{ij}^2=0 a i j 2 = 0 表示從v i 到 v j v_i到v_j v i 到 v j 的沒有長度爲2的路(有沒有其他長度的路不一定)
一般的:A l + 1 = ( a i j l + 1 ) n × n , a i j l + 1 = ∑ k = 1 n a i k l ⋅ a k j 1 ; A_{l+1}=(a_{ij}^{l+1})n\times n,\\a_{ij}^{l+1}=\sum_{k=1}^na_{ik}^l \cdot a_{kj}^1;
A l + 1 = ( a i j l + 1 ) n × n , a i j l + 1 = k = 1 ∑ n a i k l ⋅ a k j 1 ;
a i j l + 1 表 示 從 v i 到 v j 的 長 度 爲 l + 1 的 路 的 總 數 。 a_{ij}^{l+1}表示從v_i到v_j的長度爲l+1的路的總數。 a i j l + 1 表 示 從 v i 到 v j 的 長 度 爲 l + 1 的 路 的 總 數 。
定理6 :設G G G 爲簡單有向圖,A A A 是它的鄰接矩陣,則a i j m a_{ij}^m a i j m 是由 v i 由v_i 由 v i 到v j v_j v j 的長度爲m的路的條數。(這裏的路和圈都未必是簡單路,簡單圈。)
4.2 可達矩陣
4.2.1 可達矩陣的定義
根據定理4:在一個( n , m ) (n,m) ( n , m ) 圖中,任一初級路(無重複點)的長度小於等於n − 1 n-1 n − 1 ,任一初級圈的長度小於等於n n n 。
若從v i 到 v j v_i到v_j v i 到 v j 有路,則從v_i到v_j必有一條初級路;若從v_i到v_j有圈,則必有一條長度不超過n的初級圈。
B = A + A 2 + A 3 + … + A n
B=A+A^2+A^3+…+A^n
B = A + A 2 + A 3 + … + A n
矩 陣 B 的 元 素 b i j 給 出 了 由 v i 到 v j 的 所 有 長 度 從 1 到 n 的 路 的 總 條 數 矩陣B的元素b_{ij}給出了由v_i到v_j的所有長度從1到n的路的總條數 矩 陣 B 的 元 素 b i j 給 出 了 由 v i 到 v j 的 所 有 長 度 從 1 到 n 的 路 的 總 條 數 。
e . g . e.g. e . g . :B = A + A 2 + A 3 + A 4 = [ 3 4 2 3 5 5 4 6 7 7 4 7 3 2 1 2 ]
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}
B = A + A 2 + A 3 + A 4 = ⎣ ⎢ ⎢ ⎡ 3 5 7 3 4 5 7 2 2 4 4 1 3 6 7 2 ⎦ ⎥ ⎥ ⎤
從結點v_2v_4之間共有6條路。
如果結點很多將可能會有更多的路,現在將注意點放到是否有路這一問題 上,需要將矩陣B進行改造,並用下面定義的矩陣R來描述圖G的各結點見間的可達性。
定義20 :設 G = ( V , E ) 是 簡 單 有 向 圖 , V = v 1 , v 2 , . . . , v n 被 強 行 命 名 , n 階 方 陣 稱 R = ( r i j ) n × n 爲 圖 G 的 可 達 矩 陣 , 其 中 設G=(V,E)是簡單有向圖,V={v_1,v_2,...,v_n}被強行命名,n階方陣稱R=(r_{ij})n \times n爲圖G的可達矩陣,其中 設 G = ( V , E ) 是 簡 單 有 向 圖 , V = v 1 , v 2 , . . . , v n 被 強 行 命 名 , n 階 方 陣 稱 R = ( r i j ) n × n 爲 圖 G 的 可 達 矩 陣 , 其 中
r i j = { 1 , v i 到 v j 可 達 0 , v i 到 v j 不 可 達
r_{ij}=\begin{cases}1,&v_i到v_j可達\\0,&v_i到v_j不可達\end{cases}
r i j = { 1 , 0 , v i 到 v j 可 達 v i 到 v j 不 可 達
特別是
r i i = { 1 , v i 到 v i 有 圈 0 , v i 到 v i 無 圈
r_{ii}=\begin{cases}1,&v_i到v_i有圈\\0,&v_i到v_i無圈\end{cases}
r i i = { 1 , 0 , v i 到 v i 有 圈 v i 到 v i 無 圈
在可達性的規定中 v i v_i v i 到 v i v_i v i 總是可達的,而上面定義中是說 r i i = 1 r_{ii}=1 r i i = 1 是表示v i v_i v i 到v i v_i v i 有圈,這兩者不衝突,只是鄰接矩陣的定義中 ( v i , v i ) ∉ E (v_i,v_i) \notin E ( v i , v i ) ∈ / E 中。
所以,r i i = 1 r_{ii}=1 r i i = 1 時,表示的是從 v i 出 發 , 經 過 非 v i 結 點 , 可 以 回 到 v i 從v_i出發,經過非v_i結點,可以回到v_i 從 v i 出 發 , 經 過 非 v i 結 點 , 可 以 回 到 v i 。r i i = 1 r_{ii}=1 r i i = 1 時,表示G中至少有一條通過v i v_i v i 的有向圈。
如何去確定一個給定圖的可達矩陣:
先求出圖G的鄰接矩陣A;
然後求A 2 , A 3 , A 4 , . . . , A n A^2,A^3,A^4,...,A^n A 2 , A 3 , A 4 , . . . , A n ,由此得到矩陣B;
由B確定R。
R = A ∨ A ( 2 ) ∨ A ( 3 ) ∨ . . . ∨ A ( n ) R=A\vee A^{(2)}\vee A^{(3)}\vee... \vee A^{(n)}
R = A ∨ A ( 2 ) ∨ A ( 3 ) ∨ . . . ∨ A ( n )
e . g . e.g. e . g . :給定圖G=(V,E)
將V強行命名爲V = v 1 , v 2 , v 3 , v 4 V={v_1,v_2,v_3,v_4} V = v 1 , v 2 , v 3 , v 4 ,則G的鄰接矩陣爲
A = [ 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 ] A=\begin{bmatrix}0&0&0&1\\1&0&1&1\\0&0&0&0\\0&1&1&0\end{bmatrix} A = ⎣ ⎢ ⎢ ⎡ 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 ⎦ ⎥ ⎥ ⎤
同時有:
A ( 2 ) = [ 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 ] , A ( 3 ) = [ 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 ] , A ( 4 ) = [ 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 ] 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} A ( 2 ) = ⎣ ⎢ ⎢ ⎡ 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 ⎦ ⎥ ⎥ ⎤ , A ( 3 ) = ⎣ ⎢ ⎢ ⎡ 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 ⎦ ⎥ ⎥ ⎤ , A ( 4 ) = ⎣ ⎢ ⎢ ⎡ 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 ⎦ ⎥ ⎥ ⎤
所以,G的可達矩陣爲
R = [ 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 ] R=\begin{bmatrix}1&1&1&1\\1&1&1&1\\0&0&0&0\\1&1&1&1\end{bmatrix} R = ⎣ ⎢ ⎢ ⎡ 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 ⎦ ⎥ ⎥ ⎤
4.2.1 W a r s h a l l Warshall W a r s h a l l 算法
給定圖G = ( V , E ) G=(V,E) G = ( V , E ) ,將結點集V V V 強行命名爲V = 1 , 2 , 3 , . . . , n , W a r s h a l l V={1,2,3,...,n},Warshall V = 1 , 2 , 3 , . . . , n , W a r s h a l l 算法的基本思想是構造一個矩陣序列
A = R ( 0 ) , R ( 1 ) , R ( 2 ) , . . . , R ( n ) = R A=R^{(0)},R^{(1)},R^{(2)},...,R^{(n)} =R A = R ( 0 ) , R ( 1 ) , R ( 2 ) , . . . , R ( n ) = R
這裏R ( 0 ) = A R^{(0)}=A R ( 0 ) = A 是鄰接矩陣,R = R ( n ) R=R^{(n)} R = R ( n ) 就是可達矩陣。
W a r s h a l l Warshall W a r s h a l l 算法步驟,以v i 到 v j v_i到v_j v i 到 v j 是否有路爲例:
第一步:由A求R ( 0 ) R^{(0)} R ( 0 ) ,R ( 0 ) = A R^{(0)}=A R ( 0 ) = A r i j ( 0 ) = a i j r_{ij}^{(0)}=a_{ij} r i j ( 0 ) = a i j
其中r i j ( 0 ) 爲 R ( 0 ) r_{ij}^{(0)}爲R^{(0)} r i j ( 0 ) 爲 R ( 0 ) 的元素,a i j a_{ij} a i j 爲鄰接矩陣A的元素。
第二步:由R ( 0 ) R^{(0)} R ( 0 ) 求R ( 1 ) R^{(1)} R ( 1 ) ,r i j ( 1 ) = r i j ( 0 ) ∨ ( r i 1 ( 0 ) ∧ r 1 j ( 0 ) ) r_{ij}^{(1)}=r_{ij}^{(0)}\vee (r_{i1}^{(0)}\wedge r_{1j}^{(0)}) r i j ( 1 ) = r i j ( 0 ) ∨ ( r i 1 ( 0 ) ∧ r 1 j ( 0 ) )
r i j ( 0 ) r_{ij}^{(0)} r i j ( 0 ) 用來判斷是否直接有邊相連,若結點v i v_i v i 到結點v j v_j v j 直接有邊相連,則r i j ( 1 ) = 1 r_{ij}^{(1)}=1 r i j ( 1 ) = 1 ;
( r i 1 ( 0 ) ∧ r 1 j ( 0 ) ) (r_{i1}^{(0)}\wedge r_{1j}^{(0)}) ( r i 1 ( 0 ) ∧ r 1 j ( 0 ) ) 用來判斷結點v i v_i v i 是否經過結點v 1 v_1 v 1 可達v j v_j v j ,若結點v i v_i v i 到結點v 1 v_1 v 1 有邊,且結點v 1 v_1 v 1 到結點v j v_j v j 有邊,即結點v i , v j v_i,v_j v i , v j 可通過結點v 1 v_1 v 1 相連,則r i j ( 1 ) = 1 r_{ij}^{(1)}=1 r i j ( 1 ) = 1 。
第三步:由R ( 1 ) R^{(1)} R ( 1 ) 求R ( 2 ) , R^{(2)}, R ( 2 ) , r i j ( 2 ) = r i j ( 1 ) ∨ ( r i 2 ( 1 ) ∧ r 2 j ( 1 ) ) r_{ij}^{(2)}=r_{ij}^{(1)}\vee (r_{i2}^{(1)}\wedge r_{2j}^{(1)}) r i j ( 2 ) = r i j ( 1 ) ∨ ( r i 2 ( 1 ) ∧ r 2 j ( 1 ) )
若r i j ( 1 ) = 1 r_{ij}^{(1)}=1 r i j ( 1 ) = 1 ,即結點v i v_i v i 到結點v j v_j v j 直接有邊相連或通過結點1相連時,則r i j ( 2 ) = 1 r_{ij}^{(2)}=1 r i j ( 2 ) = 1 ;
若r i 2 ( 1 ) = 1 r_{i2}^{(1)}=1 r i 2 ( 1 ) = 1 (即結點v i v_i v i 到結點v 2 v_2 v 2 直接有邊或通過結點v 1 v_1 v 1 相連),r 2 j ( 1 ) = 1 r_{2j}^{(1)}=1 r 2 j ( 1 ) = 1 (即結點v 2 v_2 v 2 到結點v j v_j v j 直接有邊或通過結點v 1 v_1 v 1 相連),則r i j ( 2 ) = 1 r_{ij}^{(2)}=1 r i j ( 2 ) = 1 。
r i j ( 2 ) = 1 ⇔ r_{ij}^{(2)}=1 \Leftrightarrow r i j ( 2 ) = 1 ⇔ 結點v i v_i v i 到結點v j v_j v j 直接有邊相連或通過結點v 1 、 v 2 v_1、v_2 v 1 、 v 2 相連;
第k k k 步:由R ( k − 1 ) R^{(k-1)} R ( k − 1 ) 求R ( k ) R^{(k)} R ( k ) r i j ( k ) = r i j ( k − 1 ) ∨ ( r i k ( k − 1 ) ∧ r k j ( k − 1 ) ) r_{ij}^{(k)}=r_{ij}^{(k-1)}\vee (r_{ik}^{(k-1)}\wedge r_{kj}^{(k-1)}) r i j ( k ) = r i j ( k − 1 ) ∨ ( r i k ( k − 1 ) ∧ r k j ( k − 1 ) )
r i j ( k ) = 1 ⇔ r_{ij}^{(k)}=1 \Leftrightarrow r i j ( k ) = 1 ⇔ 結點v i v_i v i 到結點v j v_j v j 直接有邊相連或通過結點v 1 , v 2 , . . . , v k v_1,v_2,...,v_k v 1 , v 2 , . . . , v k 相連。
第n n n 步:由R ( n − 1 ) R^{(n-1)} R ( n − 1 ) 求R ( n ) R^{(n)} R ( n ) r i j ( n ) = r i j ( n − 1 ) ∨ ( r i n ( n − 1 ) ∧ r n j ( n − 1 ) ) r_{ij}^{(n)}=r_{ij}^{(n-1)}\vee (r_{in}^{(n-1)}\wedge r_{nj}^{(n-1)}) r i j ( n ) = r i j ( n − 1 ) ∨ ( r i n ( n − 1 ) ∧ r n j ( n − 1 ) )
r i j ( n ) = 1 ⇔ r_{ij}^{(n)}=1 \Leftrightarrow r i j ( n ) = 1 ⇔ 結點v i v_i v i 到結點v j v_j v j 之間可以通過不超過n的結點相連。
e . g . e.g. e . g . :用W a r s h a l l Warshall W a r s h a l l 算法求圖G的可達矩陣。
將V V V 強行命名爲V = { 1 , 2 , 3 , 4 } V=\{1,2,3,4\} V = { 1 , 2 , 3 , 4 } ,則
求R ( 0 ) R^{(0)} R ( 0 )
求R ( 1 ) R^{(1)} R ( 1 )
求R ( 2 ) R^{(2)} R ( 2 )
求R ( 3 ) R^{(3)} R ( 3 )
r i j ( 0 ) = a i j r_{ij}^{(0)}=a_{ij} r i j ( 0 ) = a i j
r i j ( 1 ) = r i j ( 0 ) ∨ ( r i k ( 0 ) ∧ r k j ( 0 ) ) r_{ij}^{(1)}=r_{ij}^{(0)}\vee (r_{ik}^{(0)} \wedge r_{kj}^{(0)}) r i j ( 1 ) = r i j ( 0 ) ∨ ( r i k ( 0 ) ∧ r k j ( 0 ) )
r i j ( 2 ) = r i j ( 1 ) ∨ ( r i k ( 1 ) ∧ r k j ( 1 ) ) r_{ij}^{(2)}=r_{ij}^{(1)}\vee (r_{ik}^{(1)} \wedge r_{kj}^{(1)}) r i j ( 2 ) = r i j ( 1 ) ∨ ( r i k ( 1 ) ∧ r k j ( 1 ) )
r i j ( 3 ) = r i j ( 2 ) ∨ ( r i k ( 2 ) ∧ r k j ( 2 ) ) r_{ij}^{(3)}=r_{ij}^{(2)}\vee (r_{ik}^{(2)} \wedge r_{kj}^{(2)}) r i j ( 3 ) = r i j ( 2 ) ∨ ( r i k ( 2 ) ∧ r k j ( 2 ) )
f o r i i n r a n g ( n ) : f o r i i n r a n g ( n ) : r i j ( 0 ) \\for\ i\ in\ rang(n):\\ \hspace{5mm}for\ i\ in\ rang(n):\\\hspace{5mm}r_{ij}^{(0)} f o r i i n r a n g ( n ) : f o r i i n r a n g ( n ) : r i j ( 0 )
f o r i i n r a n g ( n ) : f o r j i n r a n g ( n ) : f o r k i n r a n g ( n ) : r i j ( 1 ) = r i j ( 0 ) ∨ ( r i k ( 0 ) ∧ r k j ( 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)}) f o r i i n r a n g ( n ) : f o r j i n r a n g ( n ) : f o r k i n r a n g ( n ) : r i j ( 1 ) = r i j ( 0 ) ∨ ( r i k ( 0 ) ∧ r k j ( 0 ) )
f o r i i n r a n g ( n ) : f o r j i n r a n g ( n ) : f o r k i n r a n g ( n ) : r i j ( 2 ) = r i j ( 1 ) ∨ ( r i k ( 1 ) ∧ r k j ( 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)}) f o r i i n r a n g ( n ) : f o r j i n r a n g ( n ) : f o r k i n r a n g ( n ) : r i j ( 2 ) = r i j ( 1 ) ∨ ( r i k ( 1 ) ∧ r k j ( 1 ) )
f o r i i n r a n g ( n ) : f o r j i n r a n g ( n ) : f o r k i n r a n g ( n ) : r i j ( 3 ) = r i j ( 2 ) ∨ ( r i k ( 2 ) ∧ r k j ( 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)}) f o r i i n r a n g ( n ) : f o r j i n r a n g ( n ) : f o r k i n r a n g ( n ) : r i j ( 3 ) = r i j ( 2 ) ∨ ( r i k ( 2 ) ∧ r k j ( 2 ) )
R ( 0 ) = A = [ 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 ] , R ( 1 ) = [ 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 ] , R ( 2 ) = [ 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 ] , R ( 3 ) = [ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ] , R ( 4 ) = [ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ] = 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
R ( 0 ) = A = ⎣ ⎢ ⎢ ⎡ 0 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 ⎦ ⎥ ⎥ ⎤ , R ( 1 ) = ⎣ ⎢ ⎢ ⎡ 0 0 1 1 1 0 1 1 0 1 0 0 0 1 1 0 ⎦ ⎥ ⎥ ⎤ , R ( 2 ) = ⎣ ⎢ ⎢ ⎡ 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 ⎦ ⎥ ⎥ ⎤ , R ( 3 ) = ⎣ ⎢ ⎢ ⎡ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ⎦ ⎥ ⎥ ⎤ , R ( 4 ) = ⎣ ⎢ ⎢ ⎡ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ⎦ ⎥ ⎥ ⎤ = R
運用W a r s h a l l Warshall W a r s h a l l 算法求G G G 的可達矩陣不僅節省時間,而且節約了空間。
4.3 可達矩陣與圖的連通性
有向圖的連通性,有下列判斷方法:
G是強連通的 ⇔ \Leftrightarrow ⇔ R是全1的矩陣;
G是單向連通的 ⇔ \Leftrightarrow ⇔ R ∨ R T R \vee R^T R ∨ R T 的元素除主對角線外全是1;
G是弱連通的 ⇔ \Leftrightarrow ⇔ 由A ∨ A T A\vee A^T A ∨ A T 確定的R是全1矩陣;
G中有圈 ⇔ \Leftrightarrow ⇔ R中某些主對角線的元素r i i = 1 r_{ii}=1 r i i = 1 。
五、帶權圖的最短路徑
5.1 帶權圖的定義
定義21 :設G = ( V , E ) G=(V,E) G = ( V , E ) 是簡單圖 ,若對於每一個e ∈ E e\in E e ∈ E ,均有一正實數W ( e ) W(e) W ( e ) 與之對應,則稱W W W 是G G G 的權函數,並稱G 爲 帶 有 權 W G爲帶有權W G 爲 帶 有 權 W 的圖,簡稱帶權圖。
定義22 :設M = ( e i 1 , e i 2 , . . . , e i k ) \mathcal{M}=(e_{i_1},e_{i_2},...,e_{i_k}) M = ( e i 1 , e i 2 , . . . , e i k ) 是帶權圖中的一條路,M \mathcal{M} M 的路長爲W ( M ) = ∑ l = 1 k W ( e i l ) W(\mathcal{M})=\sum_{l=1}^kW(e_{i_l}) W ( M ) = l = 1 ∑ k W ( e i l ) 從u 到 v u到v u 到 v 的最短路P \mathcal{P} P 是指滿足下述條件的路W ( P ) = m i n { W ( M ) ∣ M 爲 從 u 到 v 的 路 } W(\mathcal{P})=min\{W(\mathcal{M})|\mathcal{M}爲從u到v的路\} W ( P ) = m i n { W ( M ) ∣ M 爲 從 u 到 v 的 路 }
如果每條邊的權函數值爲1,則帶權圖的路長與一般圖的路長是一致的。
5.2 D i j k s t r a Dijkstra D i j k s t r a 算法
假定給定帶權圖G G G ,要求G G G 中從v 0 v_0 v 0 到v v v 的最短路徑,D i j k s t r a Dijkstra D i j k s t r a 算法的基本思想是:
將圖G中結點結合V V V 分成兩部分:
一部分稱爲具 有 P 標 號 具有P標號 具 有 P 標 號 的集合,結點a a a 的P P P 標號是指從v 0 v_0 v 0 到a a a 的最短路的路長;
另一部分稱爲具 有 T 標 號 具有T標號 具 有 T 標 號 的集合,結點b b b 的T T T 標籤是指從v 0 v_0 v 0 到b b b 的某條路徑的長度。
D i j k s t r a Dijkstra D i j k s t r a 算法中首先將v 0 v_0 v 0 取爲P標號結點,其餘的結點均爲T標號結點;
然後逐步地將具有T T T 標號的結點改爲P P P 標號結點,當結點v v v 被改爲P P P 標號時,則找到了從v 0 v_0 v 0 到v v v 的一條最短路徑。
D i j k s t r a Dijkstra D i j k s t r a 算法的步驟:
先給v 0 v_0 v 0 一個P P P 標號,v 0 v_0 v 0 的P P P 標號d ( v 0 ) = 0 d(v_0)=0 d ( v 0 ) = 0 ,並且P = { v 0 } P=\{v_0\} P = { v 0 } ;對於v i ∈ T = V ∖ P v_i \in T=V\setminus P v i ∈ T = V ∖ P 給T T T 標號,它們的T T T 標號按下式確定:
d ( v i ) = { W ( v 0 , v i ) , 若 ( v 0 , v i ) ∈ E ∞ , 若 ( v 0 , v i ) ∉ E d(v_i)=\begin{cases}W(v_0,v_i),&若(v_0,v_i)\in E\\\infty,&若(v_0,v_i)\notin E \end{cases} d ( v i ) = { W ( v 0 , v i ) , ∞ , 若 ( v 0 , v i ) ∈ E 若 ( v 0 , v i ) ∈ / E
(1)尋找具有最小T T T 標號的結點。假設最小T T T 標號的結點爲v 1 v_1 v 1 ,則將v 1 v_1 v 1 的T T T 標號改爲P P P 標號,並且P = P ∪ { v 1 } P=P\cup \{ {v_1}\} P = P ∪ { v 1 } ;(2)修改與v 1 v_1 v 1 相鄰的結點的T標號,即對v i ∈ T = T ∖ v 1 v_i\in T=T\setminus {{v_1}} v i ∈ T = T ∖ v 1 按下式修改:d ( v i ) = { d ( v 1 ) + W ( v 1 , v i ) , 若 d ( v 1 ) + W ( v 1 , v i ) < d ( v i ) d ( v i ) , 否 則 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} d ( v i ) = { d ( v 1 ) + W ( v 1 , v i ) , d ( v i ) , 若 d ( v 1 ) + W ( v 1 , v i ) < d ( v i ) 否 則
反覆上述過程,直到v v v 爲P標號爲止。
將上述過程形式化,就得到D i j k s t r a Dijkstra D i j k s t r a 算法,P y t h o n Python P y t h o n 僞碼:
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:
d( t) = 1000
t0 = ''
if t0 != v:
for t in 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)
六、E u l e r Euler E u l e r 圖
6.1 E u l e r Euler E u l e r 圖的定義
經常遇到比如去旅遊總不會想走重複的路,或者送貨的時候怎麼避免走重複的路。比較經典的問題:
K o n i g s b e r g Konigsberg K o n i g s b e r g 七橋問題
計算機鼓輪問題
筆畫問題
中國郵路問題
定義23: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是無相連通圖 。
若存在一條路,此路通過G G G 中每條邊 一次且僅一次,則稱此圈爲E u l e r Euler E u l e r 路 ;
若存在一圈,此圈通過G G G 中每條邊 一次且僅一次,則稱此圈爲E u l e r Euler E u l e r 圈 ;
若G G G 中有E u l e r Euler E u l e r 圈,則稱G G G 爲E u l e r Euler E u l e r 圖 。
定理7: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是無向連通圖,那麼G是Euler圖的充要條件是G中每個結點都是偶結點 。
推論7.1: 設G G G 爲無向連通圖,G G G 中具有E u l e r Euler E u l e r 路的充要條件是G G G 中恰有兩個奇結點 。
定義24: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是一無向圖,e ∈ E e \in E e ∈ E ,若W ( G ∖ e ) > W ( G ) W(G\setminus e)>W(G) W ( G ∖ e ) > W ( G ) ,則稱e e e 爲G G G 的割邊 ,其中W ( G ) W(G) W ( G ) 表示G G G 的連通支數。
6.2 F l e u r y Fleury F l e u r y 算法
如何在恰有兩個奇結點的連通圖中尋找E u l e r Euler E u l e r 路,可參考下面的方法。
F l e u r y Fleury F l e u r y 算法:從一個奇結點出發,按下面步驟走一條路到另一個奇結點。
從一個奇結點出發,每走一邊抹去一邊;
在走邊的過程中,除非沒有其他選擇時才走割邊。
6.3 有向圖的E u l e r Euler E u l e r 圖
定理8: 一個有向圖有E u l e r Euler E u l e r 路 必須且只須(1)此圖是連通的(強連通),並且每個結點的入度等於出度;或( 2 ) (2) ( 2 ) 最多隻有兩個結點例外,它們中一個結點的入度比出度多1,另一結點的出度比入度多1。
定理9: 一個有向圖有E u l e r Euler E u l e r 圈,必須且只須此圖是連通的,且每個結點的入度等於出度。
定理10: 設C C C 是帶權圖G G G 的一條包含G G G 中各邊的圈,則C C C 具有最小長度的充要條件是:
每條邊最多重複一次;
在G的每個初級圈上,有重複邊的長度只和不超過圈長的一半。
七、H a m i l t o n Hamilton H a m i l t o n 圖
7.1 H a m i l t o n Hamilton H a m i l t o n 圖的定義
上面是討論:一個圖是否有通過圖中每條邊 一次且僅一次的路或圈的問題;
下面將討論:圖中是否存在通過每個結點 一次且僅一次的路和圈的問題。
H a m i l t o n Hamilton H a m i l t o n 圖是由H a m i l t o n Hamilton H a m i l t o n 爵士提出的周遊世界問題,所構建的圖算法模型:
一個正十二面體,有二十個頂點,看做20個城市,能否找到一條旅遊線路線,使得由任意 一個城市出發,沿着交通線經過每個城市一次且恰好一次 ,然後回到出發地?
7.1.1 H a m i l t o n Hamilton H a m i l t o n 圖的定義
定義25: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是無向連通圖 。
若存在一條路,此路經過G G G 中每個結點一次且僅一次,則稱此路爲H a m i l t o n Hamilton H a m i l t o n 路,記作H-路;
若存在一圈,此圈經過G G G 中每個結點一次且僅一次,則稱此圈爲H a m i l t o n Hamilton H a m i l t o n 圈(又叫H a m i l t o n Hamilton H a m i l t o n 迴路),記作,H-圈;
若G中有H-圈,則稱G爲H a m i l t o n Hamilton H a m i l t o n 圖。
7.1.2 H a m i l t o n Hamilton H a m i l t o n 圖的必要條件
定理11: 若G G G 是H a m i l t o n Hamilton H a m i l t o n 圖,則對於集合V V V 的任一非空子集S S S ,均有W ( G ∖ S ) ≤ ∣ S ∣ W(G\setminus S)\leq |S| W ( G ∖ S ) ≤ ∣ S ∣ 其中∣ S ∣ |S| ∣ S ∣ 表示集合的結點數,W ( G ) W(G) W ( G ) 表示G的連通支數;G ∖ S G\setminus S G ∖ S 表示在G中刪除S中的結點以及以S中的點爲端點的所有邊而剩下的圖;W ( G ∖ S ) W(G\setminus S) W ( G ∖ S ) 表示圖G ∖ S G\setminus S G ∖ S 的連通支。
證 明 證明 證 明 :
\hspace{1cm} 設C C C 是G G G 中的H a m i l t o n Hamilton H a m i l t o n 圈,因爲在迴路中,依次刪去一結點及與此結點相鄰的兩條邊(圖G刪掉一點,肯定要刪掉任何與之相關聯的邊),每次最多隻增加一個分支,所以W ( C ∖ S ) ≤ ∣ S ∣ , W(C\setminus S)\leq |S|, W ( C ∖ S ) ≤ ∣ S ∣ ,
\hspace{1cm} 即類似於一個圈我切上一段,而S中有幾個結點我就切幾段,每段中包含這個結點以及與此結點相連的;
由於C ∖ S C\setminus S C ∖ S 是G ∖ S G\setminus S G ∖ S 的一個生成子圖,因此W ( G ∖ S ) ≤ W ( C ∖ S ) , W(G\setminus S)\leq W(C\setminus S), W ( G ∖ S ) ≤ W ( C ∖ S ) , 故W ( G ∖ S ) ≤ ∣ S ∣ W(G\setminus S)\leq |S| W ( G ∖ S ) ≤ ∣ S ∣
7.1.3 H a m i l t o n Hamilton H a m i l t o n 圖的充分條件
定理12: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是具有n n n 個結點的簡單無向圖,若對任意的u , v ∈ V , u,v\in V, u , v ∈ V , 均有d e g ( u ) + d e g ( v ) ≥ n − 1 deg(u)+deg(v)\geq n-1 d e g ( u ) + d e g ( v ) ≥ n − 1 則G G G 中必有一條H H H -路。
定理13: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是具有n n n 個結點的簡單無向圖,若對任意的u , v ∈ V , u,v\in V, u , v ∈ V , 均有d e g ( u ) + d e g ( v ) ≥ n deg(u)+deg(v)\geq n d e g ( u ) + d e g ( v ) ≥ n 則G G G 中必有一條H H H -路。
定義26: 完全圖的定向圖稱爲競賽圖
定理14: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是一個競賽圖,∣ V ∣ = n |V|=n ∣ V ∣ = n ,則G G G 中必有一條 H H H -路。
八、二分圖
8.1 二分圖的定義
定義27: 設G = ( V , E ) G=(V,E) G = ( V , E ) 爲簡單無向圖 ,如果存在 V V V 的一個劃分V = V 1 ∪ V 2 V=V_1 \cup V_2 V = V 1 ∪ V 2 ,使得G G G 中每一條邊的一個端點在V 1 V_1 V 1 中,另一端點在V 2 V_2 V 2 中,則稱G G G 爲二分圖 ,稱V 1 , V 2 V_1,V_2 V 1 , V 2 爲V V V 的互補結點子集 。
\hspace{1cm} 特別,當V 1 V_1 V 1 中的每一個結點都與V 2 V_2 V 2 中的每一個結點鄰接時,稱此圖爲完全二分圖 。若∣ V 1 ∣ = m , ∣ V 2 ∣ = n , |V_1|=m,|V_2|=n, ∣ V 1 ∣ = m , ∣ V 2 ∣ = n , 則將此完全二分圖記作K m , n K_{m,n} K m , n 。
e . g . : e.g.: e . g . :
如圖所示的是一個完全二分圖,其中V 1 = { v 1 , v 2 , v 3 } , V 2 = { v 4 , v 5 , v 6 } , V_1=\{v_1,v_2,v_3\},V_2=\{v_4,v_5,v_6\}, V 1 = { v 1 , v 2 , v 3 } , V 2 = { v 4 , v 5 , v 6 } , 此圖記作K 3 , 3 K_{3,3} K 3 , 3 。
8.2 二分圖的充要條件
定理15: 設G = ( V , E ) G=(V,E) G = ( V , E ) 爲簡單無向圖,G G G 爲二分圖的充要條件是G G G 中每一個圈的長度都是偶數。
定義28: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是二分圖,E ⊆ V 1 × V 2 E\subseteq V_1\times V_2 E ⊆ V 1 × V 2 。若M ⊂ E M\subset E M ⊂ E ,且M中任何兩條邊不相鄰,則稱M是G的一個匹配 ;具有邊數最多的匹配稱爲最大匹配 ;若∣ V 1 ∣ = ∣ V 2 ∣ = ∣ M ∣ , |V_1|=|V_2|=|M|, ∣ V 1 ∣ = ∣ V 2 ∣ = ∣ M ∣ , 則稱M爲完美匹配 ,匹配M中的邊e ∈ M e\in M e ∈ M 稱爲杆 。
九、平面圖
9.1 平面圖的定義
十、樹
10.1 自由樹
定義32: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是一個無向圖,若G是連通的且無圈,則稱G是一棵自由樹 。樹中的邊稱爲樹枝 ;若d e g ( v ) = 1 deg(v)=1 d e g ( v ) = 1 ,稱v v v 爲葉子 ,否則稱爲分支點 。
以下皆是樹:
定理18: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是( n , m ) (n,m) ( n , m ) 無向圖,那麼下面的六種說法是等價的:
G是一棵樹;
G的每一對結點間有且只有一條路;
G是連通的且m = n − 1 m=n-1 m = n − 1 ;
G是無圈的且m = n − 1 m=n-1 m = n − 1 ;
G是無圈的但若在G的任一對結點間加一邊時,恰形成一圈;
G是連通的但若在G中任意刪除一邊時,恰成爲兩個連通支。
定義33: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是無向圖,若G是無圈的,則稱G是一個森林。
可以看到,若G爲森林,則G的每個連通支爲一棵樹,如下圖所示就是一個森林。
10.2 生成樹
定義34: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是一個無向圖,T = ( V , E ~ ) T=(V,\widetilde E) T = ( V , E ) 是G G G 的一個生成子圖,若T T T 是一棵樹,則稱T爲G的一棵生成樹 。
生成子圖不一定是連通的,生成樹是聯通的。
定理19: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是一個無向圖,G G G 中存在 生成樹的充要條件是G G G 爲連通圖。
定理20: 設G = ( V , E ) G=(V,E) G = ( V , E ) 是一連通圖,∣ V ∣ = n |V|=n ∣ V ∣ = n ,那麼G G G 的生成子圖T = ( V , E ~ ) T=(V,\widetilde E) T = ( V , E ) 是一生成樹的充要條件是:T T T 連通且∣ E ~ ∣ = n − 1 |\widetilde E|=n-1 ∣ E ∣ = n − 1 。
10.3 最小生成樹
10.3.1 最小生成樹的定義
定義35: 設G = ( V , E , W ) G=(V,E,W) G = ( V , E , W ) 是一帶權圖,若T = { e 1 , e 2 , . . . , e n − 1 } T=\{e_1,e_2,...,e_{n-1}\} T = { e 1 , e 2 , . . . , e n − 1 } 是G G G 的一棵生成樹,定義W ( T ) = ∑ i = 1 n − 1 W ( e i ) W(T)=\sum_{i=1}^{n-1}W(e_i) W ( T ) = ∑ i = 1 n − 1 W ( e i ) ,若T 0 T_0 T 0 是G G G 的一棵生成樹,W ( T 0 ) = m i n { W ( T ) ∣ T 是 生 成 樹 } W(T_0)=min\{W(T)|T是生成樹\} W ( T 0 ) = m i n { W ( T ) ∣ T 是 生 成 樹 } ,稱T 0 T_0 T 0 爲G G G 的最小生成樹。
e i e_i e i 表示邊。
下面介紹求最小生成樹的算法。
10.3.2 K r u s k a l Kruskal K r u s k a l 算法(避圈法推廣):
將G G G 中各邊按權值由小到大排隊e 1 , e 2 , . . . , e m ( i < j ⇒ W ( e i ) ≤ W ( e j ) ) e_1,e_2,...,e_m(i<j\Rightarrow W(e_i)\leq W(e_j)) e 1 , e 2 , . . . , e m ( i < j ⇒ W ( e i ) ≤ W ( e j ) )
i : = 1 , k : = 1 , T : = { e 1 } ; i:=1,k:=1,T:=\{e_1\}; i : = 1 , k : = 1 , T : = { e 1 } ;
k : = k + 1 k:=k+1 k : = k + 1 ,若T ∪ { e k } T\cup \{e_k\} T ∪ { e k } 無圈,則i : = i + 1 , T : = T ∪ { e k } i:=i+1,T:=T\cup \{e_k\} i : = i + 1 , T : = T ∪ { e k } ,轉向4,否則轉向3;
若i = n − 1 i=n-1 i = n − 1 ,出口;否則轉向3。