Chapter 4 圖
.
1- 圖的儲存結構
無向圖:對稱
有向圖:……
2- 圖的遍歷
1 深度優先搜尋(DFS)
類似於二叉樹的先序遍歷
2 廣度優先搜尋(BFS)
類似於二叉樹的層序遍歷
3- 最小(代價)生成樹(針對無向圖)MST
1 Prim演算法 O(|V2|)
只與頂點數有關,與邊無關
2 Kruskal演算法 O(|E|log|E|)
只與邊數有關,與頂點數無關
//什麼樣的圖最小生成樹唯一?圖中所有權值不相等。
4- 最短路徑
1 Dijkstra O(|V2|)
單源最短路徑
l 要找出所有節點的最短路徑,需要對每一個結點用Dijkstra O(|V3|)
l 邊上有負權值,不適用
2 Floyd O(|V3|)
求解任意一對頂點間的最短距離
l 允許帶有負權值的邊,但不允許有負權值邊組成的迴路
5- 拓撲排序 O(|V|+|E|)
1 AOV網
以頂點表示活動,以邊表示活動的先後次序,且沒有迴路的有向圖
2 對有向無環圖的拓撲排序
可能不唯一:如果有多個入度為0的頂點,可任選一個輸出
6- 關鍵路徑
1 AOE網
活動在邊上的網,與AOV網相比
相同點:都是有向無環圖
不同點:AOE網邊表示活動、有權值,表示活動持續時間。頂點表示事件,事件是圖中新活動開始舊活動結束的標誌。
AOV網邊表示活動之間的相互關係,無權值,頂點表示活動。
l 只存在一個入度為0的點稱為源點
求關鍵路徑的步驟:
1 拓撲排序
2 事件Vk的最早發生時間Ve(k)
V1->Vi max
3 時間Vk的最遲發生時間Vl(k)
從後向前算 min = 後-max
4 活動ai的最早開始時間e(i)
邊上首結點的Ve(k)
5 活動ai的最遲開始時間l(i)
邊上尾結點的Vl(k)-ai
6 d = l(i) - e(i)
//可以通過加快那些在所有關鍵路徑上的關鍵活動來縮短工期
//關鍵路徑不唯一
注:
1- 鄰接矩陣的空間複雜度O(|V2|)
2- 鄰接表—方便找出所有鄰邊(不唯一)
鄰接矩陣—給定的兩個頂點是否存在邊
3- 十字連結串列—有向圖的鏈式儲存
容易求得頂點的入度和出度
圖的十字連結串列表示不唯一,但一個十字連結串列可以唯一確定一個圖。
4- 鄰接多重表是無向圖的另一種鏈式儲存結構
5- BFS藉助一個輔助佇列,空間複雜度是O(|V|)
鄰接表O(|V|+|E|),鄰接矩陣O(|V2|)
6- DFS藉助一個棧,空間複雜度是O(|V|)
鄰接表O(|V|+|E|),鄰接矩陣O(|V2|)
7- 當各邊權值相等時,廣度優先演算法可以解決單源最短路徑問題。
8- Prim O(|V2|)
Kruskal O(|E|log|E|)
Dijkstra O(|V2|)
Floyd O(|V3|)
拓撲 O(|V|+|E|)
9- 最短路徑一定是簡單路徑
10- 可以判斷有向圖是否有環:深度優先搜尋,拓撲排序