1584. 连接所有点的最小费用
分类:图、最小生成树
Prime算法
class Solution {
public:
int minCostConnectPoints(vector<vector<int>>& points) {
int n = points.size();
vector<bool> visited(n, false);
vector<int> cost(n, 0);//动态记录触发节点到其他节点的距离
vector<vector<int> > g(n, vector<int>(n));//图
//所有点两两连接
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
int val = abs(points[i][0]-points[j][0])+abs(points[i][1]-points[j][1]);
g[i][j] = g[j][i] = val;
}
}
//从出发点开始
int v0 = 0;
for(int i=0; i<n; i++){
cost[i] = g[v0][i];
}
visited[v0] = true;
int sum = 0;
for(int k=0; k<n-1; k++){
//找到当前子图出发的最短边
int _min = INT_MAX, next;
for(int j=0; j<n; j++){
if(!visited[j] && cost[j]<_min){
_min = cost[j];
next = j;
}
}
//边加入当前子图
visited[next]=true;
sum += _min;
//更新当前子图到其他的距离
for(int i=0; i<n; i++){
if(!visited[i] && g[next][i] < cost[i]){
cost[i] = g[next][i];
}
}
}
return sum;
}
};
另解kruskal算法,叕是并查集
2021/01/19