https://leetcode.com/problems/min-cost-to-connect-all-points/description/
給一個陣列 points
裡面裝著點不重複的二維座標資料
定義連結兩點的成本 (cost) 為兩點之曼哈頓距離 (Manhattan distance):
回傳使所有點相連的最小成本。只要任意兩點之間恰存在一條 simple path,所有點就被視為相連。
首先我們要搞懂題目想問的是什麼
題目有兩個關鍵線索:
如果我們把圖畫出來就會發現,第二點就代表若視連線為圖上的邊,那個我們連線出來的結果不應該會有 cycle
這下應該就能想到本題其實要考的就是最小生成樹 (minimum spanning tree)
提到 MST 就會想到大名鼎鼎的兩個演算法:Kruskal's algorithm 與 Prim's algorithm。兩者皆是採取 greedy 的策略,前者每次選取 weight 最小的邊加入 MST;後者則可以想成是每次選能使連出去的 weight 最小的那個點
本題我們採用 Kruskal's algorithm 結合 disjoint-set,其 pseudocode 可參考下方:
我們初始條件為對 中每個點都建一個 set (, ),若要檢查 在加入 (用來蒐集 MST 的邊)後是否會產生 cycle,相當於判斷 跟 是否在同一個 set 中,如果兩者不屬於同個 set (),那麼我們就可以安心將 加入 ()。最後我們再使用 將兩個 set 作聯集
下面提供本題我的寫法:
一樣的核心精神,不過這個寫法可能會再更平易近人些
【定義】
給定 為一個 undirected weighted graph