首页 > 编程语言 >[LeetCode] 1584.连接所有点的最小费用 Kruskal And Prim 算法 Java 并查集

[LeetCode] 1584.连接所有点的最小费用 Kruskal And Prim 算法 Java 并查集

时间:2024-05-13 13:08:05浏览次数:15  
标签:Prim parent int Kruskal 查集 find public points 复杂度

Problem: 1584. 连接所有点的最小费用

目录

Kruskal算法

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(mlog(m))$

空间复杂度:

添加空间复杂度, 示例: $O(n)$

Code

class Solution {
    public int minCostConnectPoints(int[][] points) {
        int n = points.length;
        // 生成所有边以及权重
        Edge[] edges = new Edge[n*(n-1)/2];  //完全图最多生成的边数
        int index = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i+1; j < n; j++) {  //防止生成重复的边
                edges[index++] = new Edge(i,j,Math.abs(points[i][0]-points[j][0])+Math.abs(points[i][1]-points[j][1]));
            }
        }
        // 根据权重排序
        Arrays.sort(edges,(a,b)->a.weight-b.weight);
        // 构造并查集
        UnionSet unionSet = new UnionSet(n);
        int ans = 0;
        // 执行Kruskal算法
        for (Edge edge : edges) {
            // 如果两个点已经连通,则跳过
            if(unionSet.isConnected(edge.start,edge.end)) continue;
            // 否则,将两个点连通,并且加上权重
            unionSet.union(edge.start,edge.end);
            // 执行相加
            ans += edge.weight;
        }
        return ans;
    }

    record Edge(int start, int end, int weight){}

    class UnionSet{
        private int count;
        private int[] parent;

        public UnionSet(int n){
            this.count = n;
            this.parent = new int[n];
            for (int i = 0; i < n; i++) {
                parent[i] = i;
            }
        }

        public void union(int x, int y){
            int p = find(x);
            int q = find(y);
            parent[p] = q;
            count--;
        }

        public boolean isConnected(int x, int y){
            return find(x) == find(y);
        }

        public int find(int x){
            if(parent[x] != x){
                parent[x] = find(parent[x]);
            }
            return parent[x];
        }

        public int getCount(){
            return count;
        }

    }
}

Prim算法

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n^2)$

空间复杂度:

添加空间复杂度, 示例: $O(n^2)$

Code

class Solution {
    public int minCostConnectPoints(int[][] points) {
         // 构建邻接矩阵
        int m = points.length;
        int[][] graph = new int[m][m];
        for(int i=0;i<m;i++){
            for(int j=i+1;j<m;j++){
                graph[i][j] = graph[j][i] = Math.abs(points[i][0]-points[j][0])+Math.abs(points[i][1]-points[j][1]);
            }
        }
        // prim算法
        int[] lowCost = new int[m];
        Arrays.fill(lowCost,Integer.MAX_VALUE); 
        boolean[] visited = new boolean[m];
        visited[0] = true;
        int ans = 0;
        for(int i=0;i<m;i++){
            lowCost[i] = graph[0][i];  // 先将第一个顶点的权重加上
        }
        for(int i=1;i<m;i++){
            int minIdx = -1;
            int minCost = Integer.MAX_VALUE;
            for (int j = 0; j < m; j++) {
                // 如果没有被遍历过而且权重较小则记录下来
                if(!visited[j] && lowCost[j]<minCost){
                    minIdx = j;
                    minCost = lowCost[j];
                }
            }
            visited[minIdx] = true;  // 标记遍历过
            ans+=minCost;  // 执行相加
            // 接着与下一个要遍历的顶点比较最小权重,得到最小权重数组
            for(int j=0;j<m;j++){  
                if(!visited[j]&&graph[minIdx][j]<lowCost[j]){
                    lowCost[j] = graph[minIdx][j];
                }
            }
        }
        return ans;
    }
}

标签:Prim,parent,int,Kruskal,查集,find,public,points,复杂度
From: https://www.cnblogs.com/xiaofengs/p/18189008

相关文章

  • Python-PostgreSQL主键自动填充报错:SAWarning: Column x is marked as a member of th
    importdatetimefromsqlalchemyimportColumn,String,inspect,Integerfromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemy.ormimportsessionmakerfromsqlalchemyimportcreate_engineengine=create_engine(DATABASE_URL)Base=decla......
  • 并查集
    并查集并查集模板包含路径压缩+小挂大constintMAXN=1e5+1;intfather[MAXN];//存父亲节点father[1]=2指的是1节点的父亲为2intsize[MAXN]; //存每个集合的大小intstack[MAXN];//intn;//建立并查集voidbuild(){ for(inti=0;i<=n;i++)......
  • hdu1213并查集
    第一种方法是定义每个数的老大是其自身,通过每次输入的两个数,找到它两的老大,比较大小,循环将所有大的那个老大改为小的那个数,最后输出有几个老大是其自身,案例都能过,提交就错,不知错哪了......点击查看代码importjava.util.Scanner;publicclasshdu1213{ publicstaticvoid......
  • 查询指定用户的unique,primary索引名/键值
    --1.SQL用postgres账户查询PostgreSQL中指定DB以及schema下唯一索引的信息,按照表名:索引名:索引键值并按表名排序输出SELECTt.tablenameAStable_name,i.indexnameASindex_name,string_agg(a.attname,','ORDERBYa.attnum)ASindex_keysFROMpg_i......
  • prime1
    prime1主机发现发现服务、得到80http、22ssh有登录框就SQL注入、密码爆破无登录框就目录扫描目录扫描:dribdirsearch御剑dirbuster(kali终端输入,启动图形化界面)burpsuite普通扫描dirbhttp://192.168.218.146/得到http://192.168.218.146/devhttp://192.16......
  • 边权并查集之奇偶游戏
    题目传送门:https://www.acwing.com/problem/content/241///懒得手敲题目先给一下题解:#include<iostream>#include<unordered_map>//这个题目有两个点要想明白,一个是点到根的距离标志着这个点的性质,且在路径压缩的过程中此点不会改变//第二点就是在出现新的关系,也就是要将两......
  • [算法学习笔记] 并查集
    提示:本文并非并查集模板讲解,是在模板基础上的进一步理解以及拓展。Review并查集可以用来维护集合问题。例如,已知\(a,b\)同属一个集合,\(b,c\)同属一个集合。那么\(a,b,c\)都属一个集合。并查集分为合并,查询操作。定义\(fa_i\)表示点\(i\)的父亲。为了降低复杂度,在fi......
  • Oracle以及PG中将指定用户的primary,unique索引按照指定格式输出
    ---OracleSELECTLOWER(c.table_name)||':'||LOWER(i.index_name)||':'||LOWER(wm_concat(c.column_name))ASoutputFROMall_indexesiJOINall_ind_columnscONi.index_name=c.index_nameANDi.table_name=c.table_na......
  • 并查集
    1.0并查集概念对于具有传递性质、联通集合的题目可以考虑并查集。1.1并查集模板声明:以下模板来自于https://xuq7bkgch1.feishu.cn/docx/CAbedNJ5KobvinxdyKgcKsrlnrd。有n个数,编号是1~n,最开始每个数各自在一个集合中,现在要进行m个操作,操作共有两种:1.Mab,将编号为a......
  • 528. 奶酪(并查集orBFS)
    题面如下:https://www.acwing.com/problem/content/530/大致思路是:合并所有连接的空洞,判断下表面的空洞和上表面的空洞是否是同一集合集合#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>usingnamespacestd;constintN......