文章目录

  • 最小生成树
    • 1.什么是图的最小生成树(MST)?
    • 2.最小生成树用来解决什么问题?
  • Kruskal(克鲁斯卡尔)算法
    • 算法描述
  • 图解

最小生成树

1.什么是图的最小生成树(MST)?

用N-1条边连接N个点,形成的图形一定是树。
一个具有N个点的有权无向图,最小生成树就是从图的所有边中选择N-1条出来,连接所有的N个点。这个N-1条边的边权之和是所有方案中最小的。

2.最小生成树用来解决什么问题?

用来解决如何用最小的“代价”用N-1条边连接N个点的问题。

Kruskal(克鲁斯卡尔)算法

Kruskal算法是一种巧妙利用并查集来求最小生成树的算法。
Kruskal首先初始化并查集,把N个点看做N个独立的集合。再将所有的边从小到大排序。然后按顺序枚举每一条边,如果这条边连接的两个点属于两个集合,那么就把这条边加入最小生成树,并且合并这两个集合;如果这条边连接的两个点属于同一集合,就跳过。直到选取了N-1条边为止。

算法描述

1.初始化计数器k=0;MST=0;(K用来记录边数,MST用来记录边的权值之和)
2.初始化并查集:Parent[x]=x;(把n个点初始化为n个独立的集合,每个点的父节点是它自身)
3.将所有边用Sort()从小到大排序

 for(i=1;i<=M;i++){ // M为边数,对边进行从小到大的循环if(Find(E[i].u)!=Find(E[i].v)){ // 调用查找函数,第i条边的端点u,第i条边的端点v,即查询端点u和端点v的根节点,如果根节点不相等,说明两个点处于两个不相同的集合之中Union(E[i].u,E[i].v);//把u,v个治所在的集合合并  // E[i]进行边集数组储存,表示第i条边MST+=E[i].w; //把每条边的边权相加k++; //计数器 }if(K==N-1) break; //说明生成最小生成树}

图解

//最小生成树:Kruskal算法+边集存储+并查集#include<iostream>
#include<algorithm>
using namespace std;struct Edge{int u,v,w;
}E[101]; //边集数组储存
int Parent[101];//并查集,定义Parent[]数组 int Find(int x) //查找根节点并压缩路径
{if(Parent[x]!=x)Parent[x]=Find(Parent[x]);return Parent[x]; } void Union(int x,int y){ //合并两个集合 Parent[Find(y)]=Find(x);}int Cmp(const Edge &a,const Edge &b){ //自定义比较函数 return (a.w<b.w)?1:0; }int main(){int i,j,k=0,MST=0;int N=5,M=7;//顶点数和边数 int e[9][3]={{1,2,2},{1,3,5},{1,4,2},{2,3,3},{3,4,1},{2,5,4},{3,5,6}};for(i=1;i<=M;i++){E[i].u=e[i-1][0];E[i].v=e[i-1][1];E[i].w=e[i-1][2];}//存边for(i=1;i<=M;i++){Parent[i]=i; //初始化并查集} sort(E+1,E+M+1,Cmp);//调用快排序,对应的时间复杂度为O(E*logE) printf("u v w\n");for(i=1;i<=M;i++){printf("%d %d %d\n",E[i].u,E[i].v,E[i].w);//跟踪 } //求解最小生成树 printf("\n u v w MST\n");   //时间复杂度为O(M)或者O(E) for(i=1;i<=M;i++){if(Find(E[i].u)!=Find(E[i].v)){Union(E[i].u,E[i].v);MST+=E[i].w;k++;printf("%d %d %d %d\n",E[i].u,E[i].v,E[i].w,MST);//跟踪}if(k==N-1) {break;} }printf("\n MST=%d\n",MST);} 

采用Kruskal算法生成最小生成树,并采用并查集的合并优化和查询优化。相关推荐

  1. ds图—最小生成树_Java: Kruskal算法生成最小生成树(邻接矩阵)

    Java: Kruskal算法生成最小生成树(邻接矩阵): package 输出: Kruskal=36: (E,F) (C,D) (D,E) (B,F) (E,G) (A,B) 分析: Java: ...

  2. 作业1-采用Prim算法和Kruskal算法构造最小生成树

    采用Prim算法和Kruskal算法构造最小生成树 实验报告 1.问题 2.解析 (1)Prim算法 (2)Kruskal算法 3.设计 (1)Prim算法 (2)Kruskal算法 4.分析 (1) ...

  3. CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树

    题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...

  4. C语言实现克鲁斯卡尔Kruskal算法求最小生成树(附完整源码)

    Kruskal算法求最小生成树 Edge结构体,Graph结构体 Kruskal算法求最小生成树完整源码(定义,实现,main函数测试) Edge结构体,Graph结构体 // a structure ...

  5. Prim算法和Kruskal算法求最小生成树

    Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...

  6. 用kruskal算法求最小生成树各边的权值之和

    [问题描述] 已知含有n个顶点的带权连通无向图,采用邻接矩阵存储,邻接矩阵以三元组的形式给出, 只给出不包括主对角线元素在内的下三角形部分的元素,且不包括不相邻的顶点对.求该连通图的最小生成树中各边的 ...

  7. Kruskal算法构造最小生成树

    问题[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) ...

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

    克鲁斯卡尔算法的介绍 1)克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 2)基本思想:按照权值从小到大的顺序选择 n-1条边,并保证这 n-1条边不构成回路 3)具体做法: ...

  9. Kruskal算法(最小生成树)

    上篇Prim算法简要的讲解了最小生成树.也提到过Prim算法堆优化,但本蒟蒻并没有贴Prim         (堆优化的代码).至于为什么没有贴呢?上篇Prim算法blog末尾有说明. 好勒!咱们接着 ...

最新文章

  1. 思科宣布NB-IoT平台实现商用
  2. 解决 IDEA 在 commit 代码时 git 日志乱码 (提交时填写的中文说明乱码)
  3. Java工作笔记-枚举类型反射
  4. 计算文档中不同单词出现的次数
  5. SQLAlchemy Mapping Table Columns
  6. github下载慢怎么办,国内下载release内容的解决办法
  7. 实时数据库介绍(转载)
  8. hdu 4320 Arcane Numbers 1 多校联合赛(三)第一题
  9. W ndows7安装Hp1020,hp1020打印机驱动
  10. Git可视化工具-小乌龟
  11. 用计算机算出增长比例公式,复合增长率excel公式(年均复合增长率计算器)
  12. android删除字符,【已解决】Android中EditText中退格键BackSpace键(删除键)不起效果:无法删除字符...
  13. 2019厦门科技中学计算机特长,注意看!2019厦门市属学校特长生录取入围名单公布!...
  14. 如何用Python开发QQ机器人
  15. 如何用深度学习模型为自己做个漫画画像(含代码流程)
  16. IPFS DHT专题:去中心化搜索的架构演进
  17. 图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)
  18. str和repr显示格式
  19. 牢记公式,ardupilot EKF2就是纸老虎(一)!
  20. 【打卡】广告-信息流跨域ctr预估(待更新)

热门文章

  1. c语言编程输出数组元素之和,C语言 输出一个数组中,所有元素之和为0的子序列...
  2. jq ajax异步上传文件,jQuery插件ajaxFileUpload异步上传文件
  3. IntelliJ IDEA 2020.x 入门到爱不释手
  4. bash: vim: command not found
  5. 使用Navicat Premium 12 连接远程Oracle数据库
  6. 下载ueditor-1.1.3.jar源码和源代码
  7. SpringBoot2整合Activiti6工作流框架 源码
  8. python天气查询系统有什么知识点_Python入门 天气查询程序
  9. findler mac 隐藏文件_Fiddler配合Proxifier抓包PC客户端HTTPS明文数据
  10. 深圳市南山区学计算机的视频课程,新手学电脑全套视频教程(1-27集)