1. 程式人生 > >演算法與資料結構基礎 - 圖(Graph)

演算法與資料結構基礎 - 圖(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