圖基礎
圖(Graph)應用廣泛,程序中可用鄰接表和鄰接矩陣表示圖。依據不同維度,圖可以分為有向圖/無向圖、有權圖/無權圖、連通圖/非連通圖、循環圖/非循環圖,有向圖中的頂點具有入度/出度的概念。
面對圖相關問題,第一步是將問題轉為用圖表示(鄰接表/鄰接矩陣),二是使用圖相關算法求解。
相關LeetCode題:
1042. Flower Planting With No Adjacent 題解
圖的遍歷(DFS/BFS)
圖的遍歷/搜索可使用DFS或BFS方法。DFS方法 可視化過程,BFS方法 可視化過程
相關LeetCode題:
802. Find Eventual Safe States 題解
1059. All Paths from Source Lead to Destination 題解
關於BFS,詳見:算法與數據結構基礎 - 廣度優先搜索(BFS)
最短路徑問題
BFS另可用於求解無權圖的最短路徑問題,相關LeetCode題:
對於有權圖的單源最短路徑問題,Dijkstra算法用於無負權邊的問題求解 可視化過程,Bellman-Ford算法支持判斷有無負權回路、若有則不存在最短路徑。Floyd-Warshall是求解多源、無負權邊的最短路徑問題的算法 可視化過程
相關LeetCode題:
1129. Shortest Path with Alternating Colors 題解
928. Minimize Malware Spread II 題解
787. Cheapest Flights Within K Stops 題解
最小生成樹
假設有權圖中有這樣一棵樹,滿足圖任意兩個頂點之間可達、並且這棵樹所有邊的權值之和最小。這樣的樹稱之為圖的最小生成樹(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題:
323. Number of Connected Components in an Undirected Graph 題解
更多關於Union Find,詳見:算法與數據結構基礎 - 合並查找(Union Find)
圖與拓撲排序
有這樣一類問題:節點之間存在依賴關系,求按依賴關系排列節點,這類問題可以轉換為有向無環圖(DAG)、使用拓撲排序(Topological Sort)求解。
相關LeetCode題:
444. Sequence Reconstruction 題解
更多關於拓撲排序,詳見:算法與數據結構基礎 - 拓撲排序(Topological Sort)