1.克鲁斯卡尔算法应用场景:

使用克鲁斯卡尔算法生成最小生成树。

2.克鲁斯卡尔算法介绍:

        克鲁斯卡尔算法的核心思想是:在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最小生成树的条件,就将其构造,直到最后得到一颗最小生成树。

3.克鲁斯卡尔算法示意图:

4.首先,将图中所有的边排序(从小到大),我们将以此结果来选择。排序后各边按权值从小到大依次是:

HG < (CI=GF) < (AB=CF) < GI < (CD=HI) < (AH=BC) < DE < BH < DF

接下来,我们先选择HG边,将这两个点加入到已找到点的集合。这样图就变成了:

继续,这次选择边CI(当有两条边权值相等时,可随意选一条),此时需做判断。

判断法则:当将边CI加入到已找到边的集合中时,是否会形成回路?

1、如果没有形成回路,那么直接将其连通。此时,对于边的集合又要做一次判断:这两个点是否在已找到点的集合中出现过?

  • 如果两个点都没有出现过,那么将这两个点都加入已找到点的集合中;
  • 如果其中一个点在集合中出现过,那么将另一个没有出现过的点加入到集合中;
  • 如果这两个点都出现过,则不用加入到集合中。

2、如果形成回路,不符合要求,直接进行下一次操作。

根据判断法则,不会形成回路,将点C和点I连通,并将点C和点I加入到集合中。

 

 4.代码实现:

package algorithm.krusk;/*** @author WuChenGuang*/
public class Edge implements Comparable<Edge>{int begin;int end;int weight;@Overridepublic int compareTo(Edge o) {return this.weight-o.weight;}
}
package algorithm.krusk;/*** @author WuChenGuang*/
public class Graph {Edge[] edges;int[][] array;
}
package algorithm.krusk;import java.util.Arrays;/*** @author WuChenGuang*/
public class KruskalAlg {public static void main(String[] args) {Graph graph = new Graph();int[][] array = new int[7][7];for (int i = 0; i < 7; i++) {for (int j = 0; j < 7; j++) {if (i == j) {array[i][j] = 0;} else {array[j][i] = Integer.MAX_VALUE;}}}array[0][1] = 7;array[0][3] = 5;array[1][2] = 8;array[1][3] = 9;array[2][4] = 5;array[3][4] = 15;array[4][5] = 8;array[4][6] = 9;array[5][6] = 11;graph.array = array;int k = 0;Edge[] edge = new Edge[11];for (int i = 0; i < edge.length; i++) {Edge edge1 = new Edge();edge[i] = edge1;}for (int i = 0; i < 6; i++) {for (int j = i + 1; j < 7; j++) {if (array[i][j] < Integer.MAX_VALUE) {edge[k].begin = i;edge[k].end = j;edge[k].weight = array[i][j];k++;}}}graph.edges = edge;Arrays.sort(edge);kruskal(graph);}/*** 是否会构成回路*/public static int findParentRoot(int target, int[] parent) {while (parent[target] > 0) {target = parent[target];}return target;}public static void kruskal(Graph graph) {Edge[] edges = graph.edges;int[][] arr = graph.array;int[] parent = new int[7];for (Edge edge : edges) {int begin = findParentRoot(edge.begin, parent);int end = findParentRoot(edge.end, parent);if (begin != end) {System.out.println(String.format("(%d,%d)--->%d", begin, end, edge.weight));parent[begin] = end;}}}
}

运行结果:

常用的十种算法--克鲁斯卡尔算法相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 普里姆 克鲁斯卡尔算法

    一.简介 连通图:任意2节点之间都有路径相通 最小生成树:最小权重生成树 一个 n 结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边(n-1). 最 ...

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

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

最新文章

  1. Python 搭建车道智能检测系统
  2. 一致代码段与非一致代码段
  3. Citus数据分片分布研究(二 副本与故障)
  4. 【ES11(2020)】可选链操作符和空值合并运算符
  5. linux-查看文件相关命令-cat-more-less-head-tail
  6. 抓包工具Charles使用技巧
  7. java简单模拟实现数据库连接池
  8. 你需要知道的基础算法知识——STL和基础数据结构(八)
  9. [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串...
  10. python函数详解_Python函数详解(转)
  11. 初步认识lodash.js
  12. Charles for Mac(信息抓包工具)
  13. 计算机英语演讲主题ppt模板,英文演讲主题PPT模板
  14. CentOS6.5 linux 逻辑卷管理 调整分区大小
  15. EtherCAT运动控制卡开发教程之Qt(下):SCARA机械手正反解的建立
  16. 怎么知道银行卡号对应的银行
  17. Python第四天——requests实战
  18. python 学习过程中所收藏博客原文链接666666
  19. [Linux 基础] -- Linux input 子系统要点总结
  20. #Linux#进程间通信# 管道(pipe)-标准流管道pipe

热门文章

  1. archlinux 安装过程(详细)
  2. CASS11.0功能与生俱来:南方地理信息数据成图软件SouthMap(超越经典,绘算俱佳)
  3. 分享幻灯片+在线阅读
  4. IOS 10.2打开doubleh3lix闪退的解决方法
  5. win10 上安装 pytorch + cuda
  6. 汇编实验(扬声器程序设计)
  7. 感人 机器人擂台_十大机器人电影,《环太平洋》仅排第7,第1名感动了很多人...
  8. 微信小程序 中 canvas 导出图片为黑色
  9. iReport 设计介绍
  10. Java面向对象三大特征:封装、继承、多态