Chapter 3 -- Graph ( 3 )

Application of BFS -- Testing Bipartiteness

Definition

The nodes of graph can be partitioned into two sets \(X\) and \(Y\) and one every edge has one end in \(X\) and the other end in \(Y\).We call it bipartite graph ( bigraph ) . 一個 graph 的 nodes 可以分成兩個集合,且每一條 edge 兩端連接的端點均屬不同集合者稱之為 bipartite graph ( bigraph ) 。

從此定義我們可以推得兩個 bipartite graph 性質

  • \(X\cap Y=\phi\)
  • \(\forall x_1,x_2\in X\Longrightarrow x_1\ isn't\ the\ neighbor\ of\ x_2\Longrightarrow\not\exists\ edge\ between\ x_1\ and\ x_2\)

了解其定義後,我們要問的問題是,給定一個 graph,我們如何判定是否為 bipartite graph ? 直覺一點的方式就是直接將每一個 edge 的兩個端點塗上兩個不同的顏色,然後看看是否會有衝突的地方。

如果寫成 procedure 的話 (假設 \(G\) 是 connected graph以簡化運算)

1
2
3
4
1. 先任選一點 s∈V,並且將其著色成紅色
2. 對它的所有 neighbors 著色成藍色
3. 重複對 neighbors 塗 紅/藍 色直至所有點都被著色完成
4. 若為 bipartite graph 則所有 edges 的兩端都為不同顏色

這個 procedure 要 implement 其實就是用 BFS,只是在 BFS procedure 中每一個 layer 再多加一個著色的動作即可。

[ 補充 ]

實際上,有一個定理可以幫助我們更方便來做判定 :

\(Graph\ G\ is\ bipartite,\ if\ and\ only\ if\ it\ doesn't\ have\ any\ odd\ cycle.\) 如果 \(G\) 是一個 bipartite graph,則不存在奇數 circle。也就是說,\(G\) 裡面的每一個 circle,都是由偶數條 edges 所構成。

Claim : \(G\ is\ a\ connected\ graph\ and\ L_0,L_1,\cdots are\ the\ layers\ produced\ by\ BFS\ starting\ at\ node\ s\) 1. \(There\ is\ no\ edge\ of\ G\ joins\ two\ nodes\ of\ the\ same\ layer\ \Longleftrightarrow\ if\ G\ is\ bipartite.\) 2. \(There\ is\ an\ edge\ of\ G\ joins\ two\ nodes\ of\ the\ same\ layer\ \Longleftrightarrow\ G\ contains\ an\ odd-length\ cycle.\)

Proof :

(2.\(\Longrightarrow\)) 假設在第 \(L_j\) 層有一條 edge 相連兩個 nodes \(x,y\),由於 BFS 均可以 tree 的型態表示,此兩點 \(x,y\) 與原點 \(s\) 之間必然各自存在一條 path,且這兩條 paths 會在某一層 \(L_i\) 中某一點 \(z\) 交會。

從上圖可以知道 \(x,y,z\) 三個 nodes 會形成一個 cycle,其 length\(=1+2\times (j-i)\) \(\therefore\ x,y,z\) 三個 nodes 會形成一個 odd cycle \(\Longrightarrow\) G is not a bipartite graph

(2.\(\Longleftarrow\)) Clearly by definition.

(1.) Clearly by 2.

Connectivity in directed graphs

Definition

  • Nodes \(u,v\) are mutually reachable if \(\exists\) a path from \(u\) to \(v\) and also \(\exists\) a path from \(v\) to \(u\) 若兩點間互相存在一條 path 可以從一點到另一點,則稱之為 mutmally reachable。
  • A directed graph is strongly connected if \(\forall\) pairs of nodes are mutually reachable. 一個有向圖若任兩點均為 mutually reachable,則稱其為 stronglly connected。
  • The strongly (connected) component \(S\) containing \(s\) in a directed graph is the maximal set if \(\forall v\in S\) s.t. \(v\) and \(s\) are mutually reachable. 所有和 \(s\) 為 mutually reachable 的 nodes 形成一個 strongly component。

Lemma

\(If\ u\ and\ v\ are\ mutually\ reachable,\ and\ v\ and\ w\ are\ mutually\ reachable,\ then\ u\ and\ w\ are\ mutually\ rea chable.\)

Testing strongly connectivity

如果給定一個 directed graph ,我們可以如何檢查它是否為 strongly connected ? 最直覺也是最笨的方式就是做兩次 BFS,第一次先檢查 \(s\) 可以到達的點有哪些,第二次再檢查這些點能不能回到 \(s\)

然而這樣的複雜度太高,因此稍微調整一下。

1
2
3
4
5
6
7
8
TestStronglyConnectivity(G):

1. 選擇任一點作為起始點 s
2. R=BFS(s,G)
#針對此起始點對 G 做BFS
3. R'=BFS(s,G') where G' = the graph that it's edges are reverse direction of all edges of G
#製造一個方向與 G 完全相反的有向圖 G',並做一次 BFS
4. 若 R=V=R',則 return true else false

這裡每一個步驟都是 linear time complexity,最後的總時間複雜度為 \(O(m+n)\)

關於 strongly (connected) component 有一些蠻有趣的性質

  • 任一個 directed graph 必可以拆出數個 strongly (connected) component。
  • 將 directed graph 的所有 strongly (connected) component 都各自視為一個點,那麼必會形成一個 directed acyclic graph。

Theorem

\(For\ any\ two\ nodes\ s\ and\ t\ in\ a\ directed\ graph,\ their\ strongly\ component\ are\ identical\ or\ disjoint.\) 在一個有向圖中任取兩個 nodes,這兩個 nodes 必在相同的 Strongly Component 不然就各在互斥的兩個 strongly component 中。

Proof :

( Case 1. ) \(s\) and \(t\) are mutually reachable.

Clearly be definition.

( Case 2. ) \(s\) and \(t\) are not mutually reachable.

Suppose to the contrary that \(\exists v\) s.t. \(s\) and \(v\) are mutually reachable and \(t\) and \(v\) are mutually reachable

\(\Longrightarrow\) \(s\) and \(t\) are mutually reachable. (\(\rightarrow\leftarrow\))