Kruskal 算法 最小生成树

这篇具有很好参考价值的文章主要介绍了Kruskal 算法 最小生成树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.按边从小到大进行排序
2.从小到大进行加边,保证加入的边的两端点不连通,即保证不形成回路文章来源地址https://www.toymoban.com/news/detail-690362.html

 BufferedReader  reader = new BufferedReader(new InputStreamReader(System.in)); //缓存字符输入流 先将输入放到缓存区中
 BufferedWriter writer= new BufferedWriter((new OutputStreamWriter(System.out))); //高速输出流
 n = Integer.parseInt(arr1[0]);// 将字符串数字转换成int
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;

public class Main {

    private  static int N = 100010;
    private  static int M = 200010;

    private static int n,m;

    private static int[] p = new int[N];

    private  static  int cnt;
    private  static  int res;

    private static class Node{
        private int a;
        private int b;
        private int c;

        public Node(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "a=" + a +
                    ", b=" + b +
                    ", c=" + c +
                    '}';
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader  reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer= new BufferedWriter((new OutputStreamWriter(System.out)));

        String[] arr1 = reader.readLine().split(" ");

        n = Integer.parseInt(arr1[0]);
        m = Integer.parseInt(arr1[1]);

        Node[] nodes = new Node[m];

//        int a,b,c;

        for(int i = 0; i < m; i++){
            String[] arr2 = reader.readLine().split(" ");
            int a = Integer.parseInt(arr2[0]);
            int b = Integer.parseInt(arr2[1]);
            int c = Integer.parseInt(arr2[2]);

            nodes[i] = new Node(a,b,c);

        }

        // 排序 sort重载 实现定制排序
        Arrays.sort(nodes, new Comparator<Node>() {
            @Override
            public int compare(Node o1, Node o2) {
                return o1.c - o2.c; //从小到大进行排序
            }
        });

        // 选择边
        //定义每个人的祖宗

        for(int i = 1; i <= n; i++){
            p[i] = i;
        }

        for(int i = 0; i < m; i++){
            int a = nodes[i].a;
            int b = nodes[i].b;
            int c = nodes[i].c;
            if(find(a) != find(b)){
//                System.out.println("f : "+ find(a) + " " + find(b));

                p[find(a)] = find(b);
//                System.out.println(a + " " + b);
                cnt++;
                res += c;
            }
        }

//        System.out.println(cnt + " " + res);
        if(cnt == n-1){
            System.out.println(res);
        }else System.out.println("impossible");

//        System.out.println(Arrays.toString(nodes));






    }

    public static int find(int a){
        if(p[a] != a){
            p[a] = find(p[a]);
        }

        return  p[a];
    }
}

到了这里,关于Kruskal 算法 最小生成树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第三章 搜索与图论(三)——最小生成树与二分图

    最小生成树针对无向图,有向图不会用到 Prim 求解稠密图的最小生成树 和Dijkstra的思想相似,两者都是基于贪心 区别在于Dijkstra求单源最短路,而Prim求最小生成树 最小生成树:用最少的边连通图中所有的点,使得这些边的权值和也最小 Prim中的 dis数组 含义:点到 集合 的最

    2024年02月13日
    浏览(45)
  • 图论13-最小生成树-Kruskal算法+Prim算法

    基本思想:按照权值从小到大的顺序选择 n-1 条边,并保证这 n-1 条边不构成回路 具体做法:首先构造一个只含 n 个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中 不产生 回路,直至森林变成一棵树为止。 2.2.1 如果图不联通,直接返回空,该

    2024年02月01日
    浏览(37)
  • ✔ ★ 算法基础笔记(Acwing)(三)—— 搜索与图论(17道题)【java版本】

    1. 排列数字(3分钟) 每次遍历dfs参数是 遍历的坑位 原题链接 2. n-皇后问题 原题链接 方法 1. 按行遍历(过程中有回溯、剪枝) 思想: 每次递归中,遍历一行的元素,如果可以放皇后,就递归到下一行,下一行中不行了,就返回来,回溯, 方法2. 按每个元素遍历(没有减枝)

    2024年02月05日
    浏览(43)
  • 【刷题】图论——最小生成树:Prim、Kruskal【模板】

    假设有n个点m条边。 Prim适用于邻接矩阵存的稠密图,时间复杂度是 O ( n 2 ) O(n^2) O ( n 2 ) ,可用堆优化成 O ( n l o g n ) O(nlogn) O ( n l o g n ) 。 Kruskal适用于稀疏图,n个点m条边,时间复杂度是 m l o g ( m ) mlog(m) m l o g ( m ) 。 Prim:遍历n次,每次选择 连通块和外面的点 到连通块距离

    2024年04月13日
    浏览(36)
  • 【蓝桥杯--图论】最小生成树prim、kruskal

    今日语录: 成功不是终点,失败不是致命,勇气才是取胜的关键。

    2024年01月24日
    浏览(40)
  • 【算法】复习搜索与图论

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙 🍉一起加油,去追寻、去成为更好的自己!

    2024年02月05日
    浏览(41)
  • 搜索与图论 - 搜索与图在算法中的应用【中】

    目录 迪杰斯特拉算法Dijkstra  Dijkstra求最短路 I Dijkstra求最短路 II 贝尔曼-福特算法 bellman-ford 有边数限制的最短路 SPFA算法 spfa求最短路  spfa判断负环 Floyd Floyd求最短路   该算法不能存在负权边 思路: 初始化距离数组, dist[1] = 0, dist[i] = inf; for n次循环 每次循环确定一个min加

    2023年04月08日
    浏览(75)
  • 搜索与图论(acwing算法基础)

    排列数字 n皇后 走迷宫 单链表 点击跳转至例题 idx存的是指针 树与图的深度优先搜索 树的重心 每个节点都是一个单链表 模拟队列 hh = 0 , tt = -1 有向图的拓扑序列 都是从前指向后,即有向无环图(不能有环) 所有入度为0的点,都能排在前面的位置 删掉t-j的边,仅仅是j的入度

    2024年02月08日
    浏览(36)
  • 算法基础课-搜索与图论

    题目链接:842. 排列数字 - AcWing题库 思路:写的很好的题解AcWing 842. 排列数字--深度优先遍历代码+注释 - AcWing 也可以考虑使用c++自带的next_permutation函数直接秒了: 题目链接:844. 走迷宫 - AcWing题库 思路:由于bfs是一层一层扩展,所以能保证走到终点时,走过的距离最短,所

    2024年04月15日
    浏览(46)
  • 搜索与图论:匈牙利算法

    将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图 二分图:一定不含有奇数个点数的环;可能包含长度为偶数的环, 不一定是连通图

    2024年02月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包