Java实现最小生成树算法之Kruskal算法

简介: Java实现最小生成树算法之Kruskal算法

最近做大题目主要运用的都是数据结构方面的题,既有之前的最短路径的相关的算法,也有现在的最小生成树,这里先讲解Kruskal算法,主要是我先在刚会这个,prim算法,明天再看。

Kruskal算法算法其实和之前的djs算法有点类似,主要还是每次循环找出局部最优解,也就是最小权重的那条路,一次寻找即可,这里作者一开始俊德实现起来并不麻烦,但之后发现,循环找出最优解不是最麻烦的,大不了每次排序,就行了,但是之后发现最难的一块是不能出现环,举个例子,


20181025212930129.png


如果只是单纯的按照权重来选择,肯定是这样选择的1—>2,1—>4,2—>4,这样的话会出现两个问题,第一个就是出现了环即1—>2—>4—>1这样显然是不行的,第二问题就是,这样选择出来的点事不全的,缺少了3这个点,所以选择路径的时候不仅是要看权重,还应该看选择的路径是否会构成环这种不允许出现的情况,其实重点就是这里,为了防止出现这种情况,我们又需要了解并查集这个概念,就是简单的如果两个数是一类的,那么我们就将它们合并,否则就不动,这就是并的操作,之后就是查,通过不断的向前查询,直到查询到该节点的根节点,之后用过比较两者的根节点是否相等来判断是否能够成一个环。

接下来就是最简单的最小生成树以及并查集的代码了:


import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
public class mintree {
  public static int n;//结点数
  public static int m;//路径数
  public static int check[];
  public static int count=0;
  public static HashSet<node>set=new HashSet<node>();//存储已经访问过的路径信息
  public static node[]list=new node[515556];//存储路径信息,起点,终点,路径长
  public static int find(int x)//并查集中的并
  {
    return (check[x]==x)?x:(check[x]=find(check[x]));
  }
  public static void Kruskal()
  {
    set=new HashSet<node>();
    for(int i=0;i<list.length;i++)
    {
        if(find(list[i].start)!=find(list[i].end))
        {
          count++;
          set.add(list[i]);
          check[find(list[i].start)]=find(list[i].end);
          if(count==n-1)
            break;
        }
    }
  }
  public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    n=sc.nextInt();
    m=sc.nextInt();
    check=new int [n];
    for(int i=0;i<n;i++)
      check[i]=i;
    list=new node[m];
    for(int i=0;i<m;i++)
    {
      int n1=sc.nextInt();
      int n2=sc.nextInt();
      int n3=sc.nextInt();
      node node1=new node(n1-1, n2-1, n3);
      list[i]=node1;
    }
    Arrays.sort(list);//将路径长从从小到大排序
    Kruskal();
    for(node value:set)
    {
      System.out.println((value.start+1)+"--->"+(value.end+1));
    }
  }
  static class node implements Comparable<node>//创建一个内部类并且实现Comparable接口,这样当使用Arrays.sort方法是就能直接排序了
  {
    int start;
    int end;
    int length;
    public node(int start,int end,int length)
    {
      this.start=start;
      this.end=end;
      this.length=length;
    }
    @Override
    public int compareTo(node o) {
      // TODO Auto-generated method stub
      return this.length-o.length;
    }
  }
}

作者很菜,如有不足,请指教。

相关文章
|
1天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
32 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
1天前
|
存储 算法 Java
【Java高阶数据结构】并查集-最小生成树(下)
【Java高阶数据结构】并查集-最小生成树
11 3
|
1天前
|
存储 算法 Java
【Java高阶数据结构】并查集-最小生成树(上)
【Java高阶数据结构】并查集-最小生成树(上)
11 2
|
1天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
1天前
|
人工智能 算法
一些算法的复习(最短路径、最小生成树、dp)
一些算法的复习(最短路径、最小生成树、dp)
|
1天前
|
算法
最小生成树算法
最小生成树算法
|
1天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
1天前
|
搜索推荐 算法 Java
Java实现的常用八种排序算法
提到数据结构与算法,无法避免的一点就包含排序,熟练的掌握各种排序算法则是一个程序员必备的素质之一,除此之外,排序算法也是当下各大技术公司比较喜欢问的技术点,所以,就这一点JavaBuild整理了常见的8种排序算法
12 0
|
1天前
|
机器学习/深度学习 数据采集 算法
使用 Java 实现机器学习算法
【4月更文挑战第19天】Java在数据驱动时代为机器学习提供支持,具备丰富的数学和数据结构库,适用于实现线性回归、决策树、SVM和随机森林等算法。实现时注意数据预处理、模型选择、评估指标和可视化。利用Java的库和编程能力可构建高效模型,但需按问题需求选择合适技术和优化方法。
|
1天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。

热门文章

最新文章