關於此章節的習題解答,請查閱 :https://sites.google.com/site/algorithmssolution/home/c22
一、圖的概念
圖的分類:
| |
是否有環 |
是否有重邊 |
是否有有向邊 |
| Simple Undirected Graph(簡單無向圖) |
× |
× |
× |
| Multigraph(多重圖) |
× |
√ |
× |
| Pseudograph(偽圖) |
√ |
√ |
× |
| Simple Directed Graph(簡單有向圖) |
× |
× |
√ |
| Directed Multigraph(有向多重圖) |
√ |
√ |
√ |
| Mixed Graph(混合圖) |
√ |
√ |
有向邊和無向邊共存 |
Infinite Graph:有無限個點的圖。Finite Graph:有有限個點的圖。MultiEdge:重邊。Isolated Vertex:度數為0的點。Pendant Vertex:度數為1的點。Pendant Edge:串連兩個懸掛點的邊。完全圖(Kn):任意兩個點之間都有一條邊。Complement of Graph(補圖):和G有著相同的點,但是如果補圖中有某個邊,則圖中就沒有。注意點:1、小的圖通常用鄰接矩陣。2、一般的圖演算法都是用鄰接表。3、鄰接表的儲存空間為O(V+E)。4、鄰接矩陣儲存空間為O(V^2)。5、對於無向圖,如果用鄰接矩陣儲存,則可以只儲存主對角線和主對角線以上的部分,可以節約一般空間。6、有向邊用(u,v)表示,無向邊用{u,v}表示。7、如果是加權圖,則鄰接表表示可以在鄰接表的每個節點中加一個weight,而鄰接矩陣可以在儲存格的位置用權值替代。8、無向圖中一個環有兩個度。9、無向圖中sum(deg(v))=2e,因此度數之和一定是偶數,如果給定度數序列之和為奇數,則肯定不是無向圖。10、有向圖中sum(deg-(v))=sum(deg+(v))=|E|。對於鄰接表表示有一點要注意:如果A與B、C、D相連,則A的鄰接表的順序是不定的,可能是D、C、B,也可能是C、D、B。以下是樹的概念,但是後面DFS、BFS產生深度優先樹和廣度優先樹時會用到:v的祖先:包括v和v的真祖先。v的真祖先:如果存在u(不含v),使得u到v存在一條路徑,則u為v的真祖先。v的後裔:包括v和v的真後裔。v的真後裔:如果存在u(不含v),使得v到u有一條路徑,則u為v的真後裔。強連通圖:任意兩個頂點u,v,u到v和v到u都有路徑。弱連通圖:此圖為有向圖,他不是強連通圖,但是如果把有向邊變成無向邊後,圖為連通的,則此圖為弱連通圖。二分圖(Bipartite Graph):如果一個圖的點集能被分成兩個不相交的子集V1、V2,使得每條邊都是V1中的點與V2中的點串連。完全二分圖:點集分為兩個子集後,每個子集中任意抽一個點,他們之間都有邊。著色定理:如果圖是二分圖若且唯若給圖中每個點賦予紅藍兩色之一,使得沒有一條邊的兩個頂點是同一個顏色。著色定理可以通過BFS來實現,即距離為奇數的頂點著色為藍色,偶數的頂點著色為紅色,著色完畢需要O(V+E),然後在遍曆每條邊,檢查是否著色正確,O(V+E)。定理:圖是二分圖若且唯若不可能從某個頂點開始走,經過奇數條邊又回到起點。割點:如果去掉某個點,連通分支數增加,則此點為割點。割邊(橋):如果去掉某個邊,連通分支數增加,則此邊為割邊。歐拉迴路:在圖中能找到遍曆每條邊一次的簡單迴路(注意是簡單迴路);歐拉路徑:在圖中能找到遍曆每條邊一次的簡單路徑;在無向圖中,圖中有歐拉迴路若且唯若圖中每個頂點的度數為偶數;在有向圖中,圖中有歐拉迴路若且唯若圖中每個頂點出度和入度相同;在無向圖中,圖中有歐拉路徑當且精當圖中只有兩個頂點度數為奇數;在有向圖中,圖中有歐拉路徑若且唯若圖中只有兩個點,出度入度相差奇數;漢密爾頓迴路:在圖中能找到能遍曆每個點一次的簡單迴路;漢密爾頓路徑:在圖中能找到能遍曆每個點一次的簡單路徑;連通分支:連通的點的集合,比如{A,B,C}為圖的一個連通分支;在無向圖中判斷是否存在迴路:|E|>|V|-1且連通圖,則一定有迴路。在有向圖中判斷是否存在迴路:DFS有反向邊。二、BFS用途:(1)遍曆圖。(2)在圖的每條邊的權值都為1的前提下,計算最短路徑。注意點:(1)任意一條邊(u,v),d[v]<=d[u]+1;(2)在隊列中,設隊頭為u,隊尾為v,d[v]<=d[u]+1;最最重要的一點:BFS能夠產生最短路徑樹,但是並不是所有的最短路徑樹都能夠通過BFS產生。例如:
三、DFS
樹邊:深度優先樹中出現的邊。正向邊:u到非直接後裔的邊。反向邊:u到祖先(包括自己)的邊。交叉邊:u和v不是祖先後裔關係。在無向圖中,只有樹邊和反向邊。四、拓撲排序如果存在(u,v),則f[u]>f[v].
拓撲排序有兩種實現:(1)按f[]降序DFS。(2)每次刪除一個入度為0的點。