Kruskal求最小生成树 (end数组简化并查集操作)
● 思路:
● 非常经典的最小生成树问题,这里使用Kruskal算法解决
● 先将边的关系存储(起点,终点,边长) 注意这里一共有n个点构造初始所有的边数目
应该是n(n-1)/2 条
● 按照边的长度进行排序,每次记录每个边的终点(end数组存储),将不同终点的边进行合并
我的力扣题解:
https://leetcode-cn.com/problems/min-cost-to-connect-all-points/solution/by-chen-tnv-0swc/
class Solution {
int[][] weight; // 记录边的情况
int[] end; // 记录end数组
public int minCostConnectPoints(int[][] points) {
// n 个节点 ---> 1+2...+(n-1) -->n(n-1)/2
int n=points.length;
int len=(n-1)*n/2;
weight=new int[len][3]; // 边数为点数-1 , 列记录起点终点边长
// System.out.println(len);
end=new int[points.length]; // 记录所有点的终点
int k=0;
for(int i=0;i<points.length-1;i++){
for(int j=i+1;j<points.length;j++){
weight[k][0]=i;
weight[k][1]=j;
weight[k][2]=Math.abs(points[i][0]-points[j][0])+Math.abs(points[i][1]-points[j][1]);
k++;
}
}
Arrays.sort(weight,(t1,t2)->t1[2]-t2[2]);//按照边进行排序
int anslen=0;
for(int[] temp: weight){
int p1=temp[0]; // 起点
int p2=temp[1]; // 终点
// 获取她两的根节点
int x1=p1,x2=p2;
while(end[x1]!=0){
x1=end[x1];
}
while(end[x2]!=0){
x2=end[x2];
}
if(x1!=x2){
// 将终点合并
end[x1]=x2;
anslen+=temp[2];
}
}
return anslen;
}
}