题目描述
给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。
连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。
请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单路径时,才认为所有点都已连接。
1 <= points.length <= 1000
-106 <= xi, yi <= 106
所有点 (xi, yi) 两两不同。
样例
示例 1:
输入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]]
输出: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
Prim算法求最小生成树
$O(n^2)$
class Solution {
public:
int minCostConnectPoints(vector<vector<int>>& points)
{
int len = points.size();
int res = 0;
vector<vector<int>> g(len + 1,vector<int>(len + 1,1e9 + 1));
for (int i = 1;i <= len;++i)
for (int j = 1;j <= len;++j)
g[i][j] = g[j][i] = min(g[i][j],abs(points[i - 1][0] - points[j - 1][0]) + abs(points[j - 1][1] - points[i -1][1]));
vector<bool> st(len + 1);
vector<int> dis(len + 1,1e9 + 1);
for (int i = 0;i < len;++i)
{
int t = -1;
for (int j = 1;j <= len;++j)
if (!st[j] && (-1 == t || dis[t] > dis[j])) t = j;
st[t] = true;
if (i) res += dis[t];
for (int j = 1;j <= len;++j)
dis[j] = min(dis[j],g[j][t]);
}
return res;
}
};