Kruskal算法求最小生成树 Java带输入输出

简介: Kruskal算法求最小生成树 Java带输入输出

Kruskal算法求最小生成树

给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。

求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。

给定一张边带权的无向图G=(V, E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。

由V中的全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。

输入格式

第一行包含两个整数n和m。

接下来m行,每行包含三个整数u,v,w,表示点u和点v之间存在一条权值为w的边。

输出格式

共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。

数据范围

image.png

图中涉及边的边权的绝对值均不超过1000。

输入样例:

4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4

输出样例:

6

思考方向:Kruskal算法只有两步

第一步:将所有的边按照权重值排序

第二步:按照顺序遍历点,然后如果该组的两个点没有联通,那就将其联通,并且用cnt记录边的条数,用res+=c记录边的数字总大小

import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
/**
 * @author zhouyanxiang
 * @Date 2021-03-2021/3/16-21:01
 */
public class Main {
    private static int N = 100010;
    private static int M = 200010;
    private static int max = (int) 1e9;
    private static int[] p = new int[N];
    private static int n,m;
    static Comparator<Node> cmp = new Comparator<Node>() {
        @Override
        public int compare(Node o1, Node o2) {
            return o1.c - o2.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[] edges = new Node[m];
        for (int i = 0; i < m; i++) {
            String[] arr = reader.readLine().split(" ");
            int a = Integer.parseInt(arr[0]);
            int b = Integer.parseInt(arr[1]);
            int c = Integer.parseInt(arr[2]);
            edges[i] = new Node(a,b,c);
        }
        Arrays.sort(edges,cmp);
        // 初始化
        for (int i = 1; i <= n; i++) {
            p[i] = i;
        }
        int cnt = 0;
        int res = 0;
        for (int i = 0; i < m; i++) {
            Node t = edges[i];
            int a1 = t.a;
            int b1 = t.b;
            int c1 = t.c;
            int fa = find(a1);
            int fb = find(b1);
            if (fa != fb) {
                p[fa] = fb;
                cnt++;
                res+=c1;
            }
            // 需要选中n-1条边构成树
            if (cnt == n - 1) {
                break;
            }
        }
        if (cnt == n - 1) {
            writer.write(res + "\n");
        } else {
            writer.write("impossible");
        }
        writer.flush();
        writer.close();
        reader.close();
    }
    private static class Node {
        private int a;
        private int b;
        private int c;
        public Node(int a,int b,int c) {
            super();
            this.a = a;
            this.b = b;
            this.c = c;
        }
    }
    private static int find(int x) {
      // 只要x和它的父类p[x]不联通,那就将x的父类p[x]一直往上联通p[p[x]],并且使得x = p[x]
        while (x != p[x]) {
            p[x] = p[p[x]];
            x = p[x];
        }
        return x;
    }
}


相关文章
|
8天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
21 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
5天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
15 1
|
10天前
|
人工智能 算法
一些算法的复习(最短路径、最小生成树、dp)
一些算法的复习(最短路径、最小生成树、dp)
|
10天前
|
算法
最小生成树算法
最小生成树算法
|
13天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
14天前
|
搜索推荐 算法 Java
Java实现的常用八种排序算法
提到数据结构与算法,无法避免的一点就包含排序,熟练的掌握各种排序算法则是一个程序员必备的素质之一,除此之外,排序算法也是当下各大技术公司比较喜欢问的技术点,所以,就这一点JavaBuild整理了常见的8种排序算法
6 0
|
18天前
|
机器学习/深度学习 数据采集 算法
使用 Java 实现机器学习算法
【4月更文挑战第19天】Java在数据驱动时代为机器学习提供支持,具备丰富的数学和数据结构库,适用于实现线性回归、决策树、SVM和随机森林等算法。实现时注意数据预处理、模型选择、评估指标和可视化。利用Java的库和编程能力可构建高效模型,但需按问题需求选择合适技术和优化方法。
|
22天前
|
存储 机器学习/深度学习 算法
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
21 1
|
23天前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java NIO是一种高效I/O库,特征包括非阻塞性操作、通道(如文件、网络连接)、缓冲区和选择器。选择器监控通道状态变化,通知应用程序数据可读写,避免轮询,提升性能。示例代码展示了一个使用NIO的服务器,监听连接、读取数据并处理客户端通信。
14 1
|
24天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
27 5