LC1584. 连接所有点的最小费用(Kruskal算法+end数组简化)

本文介绍了如何使用Kruskal算法解决最小生成树问题,通过构建边的关系,并对边按长度排序,利用end数组简化并查集操作,逐步合并不同终点的边,最终得到最小生成树的总长度。示例代码详细展示了算法的实现过程。
摘要由CSDN通过智能技术生成

在这里插入图片描述

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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值