目录

基本思想

实现

伪代码

实际问题求解


最小生成树:带权连通图的生成树中 边的权值之和最小的生成树。

  • 最小生成树不是唯一的。当图中的各边权值互不相等时,最小生成树是唯一的;
  • 若无向连通图本身是一棵树时(边数比顶点数少1 ),则最小生成树就是它本身。
  • 最小生成树的边数为顶点数减1。

基本思想

(找权值最小的边)

  1. 初始时为只有n 个顶点而无边的非连通图 T 每个顶点自成一个连通分量,然后按照边的权值由小到大的顺序;
  2. 不断选取当前未被选取过且权值最小的边,若该边依附的顶点落在 T 中不同的连通分量上,则将此边加入 T , 否则舍弃此边而选择下一条权值最小的边。以此类推,直至T中所有顶点都在一个连通分量上。

  • 通常在Kruskal算法中,采用堆来存放边的集合,因此每次选择最小权值的边只需的时间。此外,由于生成树中的所有边可视为一个等价类,因此每次添加新的边的过程类似于求解等价类的过程,由此可以采用并查集的数据结构来描述从而构造广的时间复杂度为。(|E|表示边数)
  • Kruskal算法适合于边稀疏而顶点较多的图。

实现

伪代码

void Kruskal(V,T) {T=V;             //初始化树,仅含顶点numS=n;      //连通分量数while(numS>l){    //若连通分量数大于1从E中取出权值最小的边(v,u); if(v和 u 属于T 中不同的连通分量){ T=TU{ (v,u) };//将此边加入生成树中numS-;        //连通分量数减1}}
}

实际问题求解

P1546 [USACO3.1]最短网络 Agri-Net

题目背景:Farmer John 被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。

题目描述:FJ 已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。

你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过。

(采用基本Kruskal算法求解:Prim算法求解见http://t.csdn.cn/OFNwt)

public class MST {class Edge{int x,y,wei;public Edge(int x,int y,int wei){this.x=x;this.y=y;this.wei=wei;}}//并查集class UFSets{private int[] vex;public UFSets(int n){vex=new int[n];for (int i = 0; i < n; i++) {vex[i]=i;}}//x的最高祖宗public int find (int x){return vex[x]==x?x:find(vex[x]);}//合并public void union (int x,int y){int fx=find(x);int fy=find(y);if (fx!=fy){vex[fx]=fy;}}}public int kruskal(int[][] w){int n=w.length;//最小生成树总权值int result=0;//顶点集初始化UFSets vex=new UFSets(n);List<Edge> list=new ArrayList<>();for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {if (w[i][j]>0){list.add(new Edge(i,j,w[i][j]));}}}list.sort(new Comparator<Edge>() {@Overridepublic int compare(Edge o1, Edge o2) {return o1.wei-o2.wei;}});//选n个边for (Edge e : list) {if (n<=0){break;}//边的两个点属于不同连通分量,则加入这条边if (vex.find(e.x)!=vex.find(e.y)){vex.union(e.x,e.y);result+=e.wei;n--;}}return result;}public static void main(String[] args) {Scanner scan=new Scanner(System.in);int n=scan.nextInt();int[][] w=new int[n][n];for (int i = 0; i < w.length; i++) {for (int j = 0; j < w.length; j++) {w[i][j]=scan.nextInt();}}System.out.println(new MST().kruskal(w));}
}

最小生成树——Kruskal算法相关推荐

  1. HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...

  2. 图的最小生成树-Kruskal算法

    问题引入 [问题描述] 编写程序,利用带权无向图的邻接矩阵存储,实现图的最小生成树Kruskal算法. [输入形式] 输入图的顶点序列及图的边的情况.如样例所示.边的输入以输入-1,-1,-1作为结束 ...

  3. 最小生成树kruskal算法

    最小生成树kruskal算法 概述 算法分析 代码 概述 克鲁斯卡尔(Kruskal)(Kruskal)(Kruskal)算法是求连通网的最小生成树的另一种方法.与普里姆(Prim)(Prim)(Pr ...

  4. 实现最小生成树Kruskal算法(附完整代码)

    实现最小生成树Kruskal算法(附完整代码) Kruskal算法是一种常见的计算最小生成树的算法.它的主要思想是将所有的边按照权值从小到大进行排序,并逐个加入到生成树中,如果加入后不会形成环,则保留 ...

  5. 最小生成树kruskal算法并查集版 C语言实现

    今天数据结构课讲了最小生成树的Kruskal算法和Prim算法,不过都只是概念,可能是怕他们听不懂吧,反正算法实现一概不讲...囧 下午抱着<算法导论>跑去图书馆看Kruskal算法,发现 ...

  6. 图论(九)最小生成树-Kruskal算法

    前面说过,Kruskal是从最短边着手构建最小生成树的.其基本过程是:先对图中的所有边按照权重值从小到大进行排序,然后着手选取边构建最小生成树.如果直接从小到大按顺序选取,有可能形成了环,所以对环的处 ...

  7. 算法实践--最小生成树(Kruskal算法)

    什么是最小生成树(Minimum Spanning Tree) 每两个端点之间的边都有一个权重值,最小生成树是这些边的一个子集.这些边可以将所有端点连到一起,且总的权重最小 下图所示的例子,最小生成树 ...

  8. C++ 实现无向图的最小生成树Kruskal算法(完整代码)

    按照Kruskal思想,n个结点的生成树有n-1条边,故反复上述过程,直到选取了n-1条边为止,就构成了一棵最小生成树. 实现Kruskal算法的关键问题是: 当一条边加入T的边集中后,如何判断是否构 ...

  9. 【数据结构与算法】图结构最小生成树Kruskal算法的Java实现

    Kruskal算法 Kruskal算法是图论中用于求解最小生成树的算法,算法时间复杂度为O(eloge) 比较起Prim算法,Kruskal算法虽然同求最小生成树,却更适合稀疏网. 这里图的储存结构建 ...

  10. 最小生成树 Kruskal算法 Prim算法

    文章目录 Kruskal算法 模板: Prim算法 模板: Kruskal算法 模板: https://blog.csdn.net/Rain722/article/details/65642992 K ...

最新文章

  1. JDK的环境变量配置
  2. Spring(十二)之JDBC框架
  3. Yet Another Walking Robot CodeForces - 1296C
  4. css清除浮动的几种方法_CSS 分享几种传统布局方法[上]
  5. MAC上使用gdb(Mac10.12未解决)
  6. IOS快速集成下拉上拉刷新
  7. mysql 1118_mysql innodb 引擎 ,建表时报错:ERROR 1118 (42000)
  8. maven实战之我见一(maven初识)
  9. 《MATLAB智能算法超级学习手册》一一1.5 简单工程应用分析
  10. linux 查看内存大小命令,Linux查看命令:CPU型号,内存大小,硬盘空间
  11. Unmapped Spring configuration files found.
  12. md文件转换成word文档
  13. 共话新基建,墨天轮数据库大咖讲坛第一期圆满成功!(附第二批中奖名单)...
  14. 用matlab演示dsb,DSB-AM的MATLAB仿真
  15. 【肌电信号】脉搏信号分析(去噪+特征提取)matlab源码含GUI
  16. 干货 || 如何在考博英语中拿高分
  17. nginx 自动屏蔽攻击者ip
  18. .NET CoreWebApi基于EasyNetQ使用RabbitMQ消息队列
  19. 计算机毕设(附源码)JAVA-SSM京东仓库管理系统
  20. 应避免的11个最常见的设计误区(上)

热门文章

  1. 珍宝鸭的力扣练习(7):分治法题目合集
  2. Masonry简单使用
  3. 电脑开机全是英文进不了系统怎么办
  4. 高中生学python有前途吗?,高中生学python有意义吗
  5. POI字体颜色不同 以及color对应index数值
  6. 如何实现 楼中楼评论(盖楼)spring boot + mybatis 附完整代码
  7. 万维网(World Wide Web)
  8. GIS十问之五:如何获得最靠谱的招聘信息?
  9. Java正则表达式去掉标点符号
  10. 牛客网编程OJ的典型输入Java模板