1. 程式人生 > 其它 >LeetCode 1584. 連線所有點的最小費用

LeetCode 1584. 連線所有點的最小費用

技術標籤:LeetCodeleetcode並查集貪心演算法

題目

給你一個points 陣列,表示 2D 平面上的一些點,其中 points[i] = [xi, yi] 。

連線點 [xi, yi] 和點 [xj, yj] 的費用為它們之間的 曼哈頓距離 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的絕對值。

請你返回將所有點連線的最小總費用。只有任意兩點之間 有且僅有 一條簡單路徑時,才認為所有點都已連線。

示例 1:

在這裡插入圖片描述

輸入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]]
輸出:20
解釋:
在這裡插入圖片描述

我們可以按照上圖所示連線所有點得到最小總費用,總費用為 20 。

注意到任意兩個點之間只有唯一一條路徑互相到達。
示例 2:

輸入:points = [[3,12],[-2,5],[-4,1]]
輸出:18
示例 3:

輸入:points = [[0,0],[1,1],[1,0],[-1,1]]
輸出:4
示例 4:

輸入:points = [[-1000000,-1000000],[1000000,1000000]]
輸出:4000000
示例 5:

輸入:points = [[0,0]]
輸出:0

提示:

1 <= points.length <= 1000
-106 <= xi, yi <= 106
所有點 (xi, yi) 兩兩不同。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/min-cost-to-connect-all-points

著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

思路

貪心+並查集

題解

class Solution {
int find(vector<int>& fa,int x)
{
    if(fa[x]!=x){
        fa[x]=find(fa,fa[x]);
    }
    return fa[x];
}
struct edge
{
    int dist,i,j;
};
public:
    int minCostConnectPoints(vector<vector<int>>& points)
{ if(points.size()==0) return 0; vector<int> fa(points.size()); for(int i=0;i<fa.size();i++){ fa[i]=i; } vector<edge> q; int dist=0; for(int i=0;i<points.size();i++){ for(int j=i+1;j<points.size();j++){ dist=abs(points[i][0]-points[j][0])+abs(points[i][1]-points[j][1]); edge e; e.dist=dist; e.i=i; e.j=j; q.push_back(e); } } sort(q.begin(),q.end(),[](const auto& a, const auto& b){ return a.dist<b.dist; }); int cnt=0,a=0,b=0,t=0; for(auto e:q){ a=find(fa,e.i); b=find(fa,e.j); if(a!=b){ cnt+=e.dist; fa[a]=b; t++; if(t==points.size()-1) break; } } return cnt; } };