LeetCode 1584. 連線所有點的最小費用
阿新 • • 發佈:2021-01-10
題目
給你一個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;
}
};