1.Nginx使用前基本的配置
阿新 • • 發佈:2021-01-20
技術標籤:Leetcode刷圖
連結:https://leetcode-cn.com/problems/min-cost-to-connect-all-points/
給你一個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)
兩兩不同。
思路:題目要求任意兩點之間只有一條簡單路徑,即不存在環路。實際上本題就是在考查有邊權的情況下如何構建一個最小樹,自然想到使用kruskal演算法。
class Solution { public: struct Edge{ int u, v, w; bool operator < (const Edge edge) const { return w < edge.w; } }; Edge edges[1000010]; int Father[1010]; int Find(int x){ return x == Father[x] ? x : Father[x] = Find(Father[x]); } bool Union(int A,int B){ A = Find(A); B = Find(B); if(A == B) return false; Father[A] = B; return true; } int minCostConnectPoints(vector<vector<int>>& points) { int n = points.size(), i, j, cnt = 0, cost = 0; for(i = 0; i < n; ++ i){ Father[i] = i; for(j = i + 1; j < n; ++ j){ edges[cnt ++] = Edge{i, j, abs(points[i][0] - points[j][0])+abs(points[i][1] - points[j][1])}; } } sort(edges, edges + cnt); -- n; for(i = 0; i < cnt; ++ i){ if(!n) break; //已經構建了n-1條邊 if(Union(edges[i].u, edges[i].v)){ -- n; cost += edges[i].w; } } return cost; } };