int dis;//所有权重和
Queue<int[]> pq;//存储横切边
UFSets uf;//并查集
public int minCostConnectPoints(int[][] points) {
int n=points.length;//顶点数量
dis=0;
pq=new PriorityQueue<>((o1, o2) -> (o1[2]-o2[2]));
uf=new UFSets(n);
//将所有边添加到队列中
for (int i = 0; i < points.length; i++) {
for (int j = i+1; j <points.length ; j++) {
//无向边只需添加一次
pq.offer(new int[]{i,j,Math.abs(points[i][0]-points[j][0])+
Math.abs(points[i][1]-points[j][1])});
}
}
//一共添加n-1条边
while (n>1){
int[] e=pq.poll();//选出最小边
int v=e[0];
int w=e[1];
//判断两个顶点是否已经加入树中
if(!uf.isConnected(v,w)){
uf.union(v,w);
dis+=e[2];
n--;
}
}
return dis;
}
最小生成树kruskal算法leetcode.1584
最新推荐文章于 2023-05-06 00:22:17 发布