① Kruskal算法先对路径的权值进行排序
② 再在图中加入这个路径(要求不产生回路)。

关键就是不能形成回路。判断是否为回路的准则是:两个顶点例如(C-E)是否有同一个终点。
关键代码:关键代码是end数组的生成,end数组用来记录每个顶点的终点。(end[ ]也是逐步完善的,一步一步填)

package Kruskal;/*** @author pdzz* @create 2019-11-30 16:07*/
public class Kruskal {private int edgeNum;//边的个数private char[] vertex;//顶点数组private int[][] matrix;//邻接矩阵private static final int INF = Integer.MAX_VALUE;public static void main(String[] args) {char[] vertexes = {'A','B','C','D','E','F','G'};int[][] matrix = {{0,12,INF,INF,INF,16,14},{12,0,10,INF,INF,7,INF},{INF,10,0,3,5,6,INF},{INF,INF,3,0,4,INF,INF},{INF,INF,5,4,0,2,8},{16,7,6,INF,2,0,9},{14,INF,INF,INF,8,9,0},};Kruskal kruskal = new Kruskal(vertexes, matrix);kruskal.kruskal();}private int getEnd(int[] ends,int i){while (ends[i] != 0){i = ends[i];}return i;}public void kruskal(){int index = 0;int[] ends = new int[edgeNum];Edata[] ret = new Edata[edgeNum];Edata[] edges = getEdges();sortEdges(edges);//System.out.println("边的集合:" + Arrays.toString(edges));//遍历边的集合,判断是否形成回路。for (int i = 0; i < edgeNum; i++) {int p1 = getPosition(edges[i].start);int p2 = getPosition(edges[i].end);//获取p1顶点的终点int m = getEnd(ends,p1);//获取p2顶点的最小下标int n = getEnd(ends,p2);if (m != n){ends[m] = n;//加入m,nret[index++] = edges[i];}}int sumWeight = 0;System.out.println("最小生成树为:");for (int i = 0; i < index; i++) {System.out.println(ret[i]);sumWeight += ret[i].weight;}System.out.println("路径总长 = " + sumWeight);}public Kruskal(char[] vertex,int[][] matrix) {//初始化顶点数和边的个数int vlen = vertex.length;this.vertex = new char[vlen];//初始化for (int i = 0;i < vlen;i++){this.vertex[i] = vertex[i];}this.matrix = new int[vlen][vlen];//传递到kruskal中的全局变量for (int i = 0; i < vlen; i++) {for (int j = 0; j < vlen; j++) {this.matrix[i][j] = matrix[i][j];}}//统计边的条数for (int i = 0; i < vlen; i++) {for (int j = i + 1; j < vlen; j++) {if (this.matrix[i][j] != INF){edgeNum++;}}}System.out.println(edgeNum);for (int i = 0; i < vlen; i++) {for (int j = 0; j < vlen; j++) {System.out.printf("%12d", matrix[i][j]);}System.out.println();}}private void sortEdges(Edata[] edges){for (int i = 0; i < edges.length - 1; i++) {for (int j = 0; j < edges.length - 1 -i; j++) {if (edges[j].weight > edges[j + 1].weight){Edata temp = edges[j];edges[j] = edges[j + 1];edges[j + 1] = temp;}}}}public int getPosition(char ch){for (int i = 0; i < vertex.length; i++) {if (vertex[i] == ch){return i;}}return -1;}private Edata[] getEdges(){int index = 0;Edata[] edata = new Edata[edgeNum];for (int i = 0; i < vertex.length; i++) {for (int j = i + 1; j < vertex.length; j++) {if (matrix[i][j] != INF){edata[index++] = new Edata(vertex[i],vertex[j],matrix[i][j]);}}}return edata;}}
class Edata{char start;char end;int weight;public Edata(char start, char end, int weight) {this.start = start;this.end = end;this.weight = weight;}@Overridepublic String toString() {return "Edata{" +"start=" + start +", end=" + end +", weight=" + weight +'}';}
}

来自尚硅谷韩顺平老师的Java数据结构的视频。

1201-2019-算法-克鲁斯卡尔算法(最小生成树MST-Kruskal算法)相关推荐

  1. 最小生成树算法-克鲁斯卡尔和普利姆

    http://www.cnblogs.com/qianbixin/p/5005161.html http://www.cnblogs.com/yoke/p/6697013.html 学习最小生成树算法 ...

  2. C语言Prims求最小生成树MST的算法(附完整源码)

    C语言Prims求最小生成树MST的算法 C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测试) C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测 ...

  3. 最小生成树:Kruskal算法 和 Prim算法(第23章)

    武侠: 飞雪连天射白鹿,笑书神侠倚碧鸳. --金庸十四著作 飞狐外传 .雪山飞狐 .连城诀 .天龙八部 .射雕英雄传 .白马啸西风 .鹿鼎记 .笑傲江湖 .书剑恩仇录 .神雕侠侣 .侠客岛 .倚天屠龙 ...

  4. 最小生成树的Kruskal算法实现

    最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...

  5. 数据结构------最小生成树之Kruskal算法

    盛年不重来,一日难再晨.及时当勉励,岁月不待人. <杂诗>陶渊明 目录 前言 一.Kruskal的几何思维 二.使用步骤 1.核心思想 2.全部测试代码 总结 前言 最小生成树算法有两种一 ...

  6. 最小生成树的Kruskal算法-详解

    最小生成树的Kruskal算法 一. 什么是最小生成树 1.1 最小生成树定义: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最 ...

  7. kruskal算法c语言,最小生成树之Kruskal算法

    上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法 ...

  8. prim算法适用条件_Prim算法和Kruskal算法介绍

    一.Prim算法 普利姆(Prim)算法适用于求解无向图中的最小生成树(Minimum Cost Spanning Tree).下面是Prim算法构造最小生成树的过程图解. 选择一个节点开始,比如V1 ...

  9. Kruskal算法(克鲁斯卡尔)最小生成树

    不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 1.Kruskal算法设计思想 实现克鲁斯卡尔算法的关键是准确判断选取的边是否与生成树中已有 ...

  10. Kruskal(克鲁斯卡尔) 最小生成树 算法详解+模板

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...

最新文章

  1. 学python需要学数据库吗-学习python用什么数据库好?
  2. cms-幻灯片的实现
  3. ANN:DNN结构演进History—RNN
  4. SSIS 学习之旅 FTP访问类
  5. thymeleaf th:href url传递多参数
  6. 【linux】ubuntu下crontab无效解决方法
  7. 数据库SQL语句之外键
  8. C语言从入门到精通——初阶1 初识C语言
  9. Python安全攻防-从入门到入狱
  10. 四种JAVA架构演进史,程序员能学会最后一种就非常厉害了,至少50k
  11. MSDTC不能启动的几个解决方法
  12. 四翼扑翼机飞控原理解析
  13. PT100铂热电阻查询表
  14. 愿所有我和码农们 printf(“前程似锦”)
  15. baidu手机卫兵给开发者生态带来新想像空间
  16. postman + node-red 发送e-mail(附件、抄送、密送)
  17. php 时间配置,php 配置正确的时间
  18. java 日历工具_java之日历处理工具类Calendar类
  19. 抖音python真的那么好吗_python看抖音用户画像,摩羯天蝎居然刷得最多?
  20. Rao-Cramer下界

热门文章

  1. uniapp项目中使用阿里图标
  2. 2022 年及以后值得关注的 18 大 DevOps 趋势
  3. 基于ROS PIXHAWK的无人船自主避障实现
  4. 基础技术篇 8 —— iBeacon技术详解与应用
  5. String字符串转数组空格处理
  6. MCM/ICM:Judging Results and Designations——What are the differences between the designations?
  7. 游戏设计的艺术:一本透镜的书——第十七章 故事和游戏在世界里发生
  8. 报告称iPhone12/Pro 5G/4G速度测试几乎比所有Android手机都要慢
  9. 【js】canvas字体不生效,解决字体加载过慢问题
  10. 育碧服务器改系统时间,《怪物猎人:世界》制作人表述PC版推迟:要保障质量 得自己做连机功能...