package com.guigu.algorithm.kruskal;import jdk.internal.org.objectweb.asm.tree.MultiANewArrayInsnNode;import java.util.Arrays;/*** @author: guorui fu* @versiion: 1.0* 克鲁斯卡算法*/
public class KruskalCase {private int edgeNum;//边的个数private char[] vertexes;//顶点数组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},};//创建对象实例KruskalCase kruskalCase = new KruskalCase(vertexes, matrix);kruskalCase.print();//拿到所有图中所有边
//        EData[] edges = kruskalCase.getEdges();
//        System.out.println("排序前" + Arrays.toString(edges));
//        kruskalCase.sortEdges(edges);
//        System.out.println("排序后" + Arrays.toString(edges));kruskalCase.kruskal();}//构造器public KruskalCase(char[] vertexes,int[][] matrix){int vlen = vertexes.length;//顶点数//初始化顶点。复制拷贝this.vertexes = new char[vlen];for (int i = 0; i < vertexes.length; i++) {this.vertexes[i] = vertexes[i];}
//        this.vertexes = vertexes;//初始化边 这次直接克隆 或者可以双层循环进行复制拷贝this.matrix = matrix.clone();//统计边for (int i = 0; i < vlen; i++) {for (int j = 0; j < vlen; j++) {if (this.matrix[i][j] != INF && this.matrix[i][j] != 0){edgeNum++;}}}}//public void kruskal(){int index = 0;//表示最后结果数组的索引//保存已有最小生成树的每个顶点的终点 也就是遍历到相同顶点时终点只能是之前保存过顶点的终点int[] ends = new int[edgeNum];//创建EData数组,保存最小生成树结果EData[] rets = new EData[edgeNum];//获取图 所有边的集合,一共有12条EData[] edges = getEdges();//按变得权值进行从小到大的排序 从权值小到大遍历sortEdges(edges);//遍历edges 判断是否构成回路for (int i = 0;i < edgeNum/2;i++){//已经排序过,从数组中最小权值的边开始//获取到第i条边的第一个顶 和 第二个顶点int p1 = getPosition(edges[i].start);int p2 = getPosition(edges[i].end);//获取p1 p2顶点在已有的最小生成树的终点是int e1 = getEnd(ends, p1);int e2 = getEnd(ends, p2);//是否构成回路 也就是终点不能相同才可以加入最小树if (e1 != e2){//ends[e1] 下标e1代表边起点 值e2代表边终点ends[e1] = e2;//e1的终点是e2rets[index++] = edges[i];//有一条边加入rets数组}}//打印最小生成树 输出retsSystem.out.println("最小生成树为=" + Arrays.toString(rets));}//打印邻接矩阵public void print(){System.out.println("邻接矩阵为:");for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; 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;}}}}//传入顶点值,返回下标private int getPosition(char ch){for (int i = 0; i < vertexes.length; i++) {if (ch == vertexes[i]){return i;}}return -1;}//获取图中的边 放入EData[]数组中,之后需要遍历该数组private EData[] getEdges(){int index = 0;EData[] edges = new EData[edgeNum/2];for (int i = 0; i < vertexes.length; i++) {//斜对称 坐标ij与ji边相同,所以遍历其中一半部分就行for (int j = i + 1; j < vertexes.length; j++) {if (matrix[i][j] != INF){//保存边的起点 终点 权值edges[index++] = new EData(vertexes[i],vertexes[j], matrix[i][j]);}}}//返回所有边的信息集合:起点 终点 权值return edges;}//获取下标为i的顶点的终点,用于判断两个顶点的终点是否相同//ends[] 是在遍历过程中逐步形成 i表示传入的顶点对应的下标private int getEnd(int[] ends,int i){while (ends[i] != 0){//循环找到终点 例如ends[1]=3 -> ends[3]=6 ->ends[6]=0 则返回终点6i = ends[i];}return i;}
}//创建一个类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 +'}';}
}

[算法] 克鲁卡尔算法 最小生成树相关推荐

  1. 用c语言描述普里姆算法和克鲁斯卡尔算法,克鲁斯卡尔算法+普里姆算法 详解

    克鲁斯卡尔算法: [1]克鲁斯卡尔算法 普里姆算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 克鲁斯卡尔算法是直接以边为目标去构建. 因为权值是在边上,直接去找最小权值的边来构建生 ...

  2. 常用的十种算法--克鲁斯卡尔算法

    1.克鲁斯卡尔算法应用场景: 使用克鲁斯卡尔算法生成最小生成树. 2.克鲁斯卡尔算法介绍:         克鲁斯卡尔算法的核心思想是:在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最 ...

  3. 数据结构与算法-克鲁斯卡尔算法(Kruskal) | 尚硅谷韩顺平

    提出问题 基本介绍 克鲁斯卡尔(Kruskal)算法,求加权连通图最小生成树的算法 基本思想:按权值从小到大顺序选择n-1条边,保证n-1条边不够成回路 具体做法:先构造一个只有n顶点的森林,然后按权 ...

  4. 算法-克鲁斯卡尔算法

    应用场景-公交站问题 1) 某城市新增 7 个站点(A, B, C, D, E, F, G) ,现在需要修路把 7 个站点连通 2) 各个站点的距离用边线表示(权) ,比如 A – B 距离 12 公 ...

  5. 算法 -克鲁斯卡尔算法

    如果形成回路则不选择 文字描述 加入的边的两个顶点不能都指向同一个终点,否则会构成回路

  6. 数据结构——最小生成树之克鲁斯卡尔算法(Kruskal)

    最小生成树算法 prime算法和克鲁斯卡尔算法 克鲁斯卡尔算法 思路 优先队列+并查集 Kuskal算法 [算法简介]:上一篇中的Prime算法是一种"加点式的算法",而Kuska ...

  7. 克鲁斯卡尔算法(Kruskal Algorithm)——图的最小生成树

    听骚话讲作者 [手动滑稽] 其实早就该写这篇博客啦. 图的最小生成树 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树可以 ...

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

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

  9. 克鲁斯卡尔算法求最小生成树

    1.克鲁斯卡尔算法 克鲁斯卡尔算法的核心思想是从边集出发,逐步把代价最小且不与已经加到最小生成树的边集构成回路的边加入到最小生成树的边集中,直到求出构成最小生成树的n-1边(n是图的顶点数).算法的基 ...

最新文章

  1. java 线程关闭小结(转)
  2. php趣味小程序,php常用小程序
  3. 以58帮帮为例看58同城典型技术架构演变
  4. CentOS下 安装xampp
  5. golang基本数据类型string字符串常用方法代码示例
  6. 第一百三十四期:MySQL分页查询方法及优化
  7. LeetCode(268)——缺失数字(JavaScript)
  8. LeetCode 114 二叉树展开为链表
  9. https 非对称加密
  10. 2007年教育学专业基础综合考试大纲(重要部分) ——下载地址
  11. 统信招5000人?难以置信
  12. 全网首发:C++中通过POST向服务器发送JSON的代码
  13. DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)...
  14. node.js 谷歌翻译api
  15. 计算机打字键盘亮怎么设置,win7系统键盘灯亮着但是不能打字的解决方法?
  16. go-sqlite3 “database is locked”问题解决方案
  17. 抱怨,就是在吸引不幸
  18. [pytorch]yolov3.cfg参数详解(每层输出及route、yolo、shortcut层详解)
  19. 图像质量评估(2) -- 图像质量相关参数:分辨率
  20. 在Ubuntu18.04.2LTS上安装电子书软件

热门文章

  1. go语言 json -转载
  2. 本地开发公众号获取code
  3. eclipse中保存Java文件时出现错误:Save could not be completed. Try File Save As... if the problem persists.
  4. 《随便测测》WEB接口测试平台
  5. matlab中plot函数画线时 颜色和类型
  6. 个人永久性免费-Excel催化剂功能第22波-Excel文件类型、密码批量修改,补齐PowerQuery短板...
  7. word文档怎么把波浪线去掉_Word实战技巧:干掉波浪线,Word中红色波浪线如何去掉?...
  8. 2021最新 JDK17 之 JAVA基础 Stream 流
  9. 美团企业版:地利尚可,天时不足
  10. 我给大家制作的专属红包封面来了,速来抢,免费领