演算法與資料結構基礎 - 圖(Graph)
圖基礎
圖(Graph)應用廣泛,程式中可用鄰接表和鄰接矩陣表示圖。依據不同維度,圖可以分為有向圖/無向圖、有權圖/無權圖、連通圖/非連通圖、迴圈圖/非迴圈圖,有向圖中的頂點具有入度/出度的概念。
面對圖相關問題,第一步是將問題轉為用圖表示(鄰接表/鄰接矩陣),二是使用圖相關演算法求解。
相關LeetCode題:
997. Find the Town Judge 題解
1042. Flower Planting With No Adjacent 題解
圖的遍歷(DFS/BFS)
圖的遍歷/搜尋可使用DFS或BFS方法。DFS方法 視覺化過程,BFS方法 視覺化過程
相關LeetCode題:
332. Reconstruct Itinerary 題解
785. Is Graph Bipartite? 題解
802. Find Eventual Safe States 題解
1059. All Paths from Source Lead to Destination 題解
133. Clone Graph 題解
關於BFS,詳見:演算法與資料結構基礎 - 廣度優先搜尋(BFS)
最短路徑問題
BFS另可用於求解無權圖的最短路徑問題,相關LeetCode題:
1162. As Far from Land as Possible 題解310. Minimum Height Trees 題解
854. K-Similar Strings 題解
對於有權圖的單源最短路徑問題,Dijkstra演算法用於無負權邊的問題求解 視覺化過程,Bellman-Ford演算法支援判斷有無負權迴路、若有則不存在最短路徑。Floyd-Warshall是求解多源、無負權邊的最短路徑問題的演算法 視覺化過程
相關LeetCode題:
1129. Shortest Path with Alternating Colors 題解
928. Minimize Malware Spread II 題解
743. Network Delay Time 題解
787. Cheapest Flights Within K Stops 題解
399. Evaluate Division 題解
最小生成樹
假設有權圖中有這樣一棵樹,滿足圖任意兩個頂點之間可達、並且這棵樹所有邊的權值之和最小。這樣的樹稱之為圖的最小生成樹(MST,Minimum spanning tree)。求最小生成樹有重要的現實應用,例如求城市之間航班的安排、使得整體成本最小。
求最小生成樹的演算法,有 Kruska演算法 視覺化過程 和 Prim演算法 視覺化過程
相關LeetCode題:
1168. Optimize Water Distribution in a Village 題解
1135. Connecting Cities With Minimum Cost 題解
圖與並查集
如果需要求解圖的某兩個頂點是否連通、圖分成多少非連通部分,這時可以用並查集(Union Find/Disjoint Set),並查集方法 視覺化過程
相關LeetCode題:
684. Redundant Connection 題解
323. Number of Connected Components in an Undirected Graph 題解
839. Similar String Groups 題解
更多關於Union Find,詳見:演算法與資料結構基礎 - 合併查詢(Union Find)
圖與拓撲排序
有這樣一類問題:節點之間存在依賴關係,求按依賴關係排列節點,這類問題可以轉換為有向無環圖(DAG)、使用拓撲排序(Topological Sort)求解。
相關LeetCode題:
207. Course Schedule 題解
210. Course Schedule II 題解
444. Sequence Reconstruction 題解
1136. Parallel Courses 題解
269. Alien Dictionary 題解
更多關於拓撲排序,詳見:演算法與資料結構基礎 - 拓撲排序(Topological Sort)
&n