什么是最小生成树(Minimum Spanning Tree)

每两个端点之间的边都有一个权重值,最小生成树是这些边的一个子集。这些边可以将所有端点连到一起,且总的权重最小

下图所示的例子,最小生成树是{cf, fa, ab} 3条边

Kruskal算法

用到上一篇中介绍的不相交集合(并查集)

首先,定义V是端点的集合,E是边的集合,A为要求的最小生成树集合

  • 初始A为空集合,每个端点都作为单独的不相交集合
  • 将所有边根据其权重进行排序
  • 对每条边(v1, v2),如果其两个端点数据不同的不相交集,则将该边加到集合A中,同时将v1和v2合并
  • 最终得到的A即为最小生成树

生成过程的示例图

C++代码示例

struct Edge {char vertex1;char vertex2;int weight;Edge(char v1, char v2, int w):vertex1(v1), vertex2(v2), weight(w) {}
};struct Graph {vector<char> vertice;vector<Edge> edges;
};unordered_map<char, char> PARENT;
unordered_map<char, int> RANK;char find(char vertex) {if (PARENT[vertex] == vertex) return PARENT[vertex];elsereturn find(PARENT[vertex]);
}void MST(Graph& g) {vector<Edge> res;for (auto c : g.vertice) {PARENT[c] = c;RANK[c] = 0;}sort(g.edges.begin(), g.edges.end(), [](Edge x, Edge y) {return x.weight < y.weight;});   // O(E*log(E))for (Edge e : g.edges) {         // O(E)char root1 = find(e.vertex1);  // 最差O(E),因为有记录深度,Find可以认为很快char root2 = find(e.vertex2);if (root1 != root2) {res.push_back(e);if (RANK[root1] > RANK[root2]) {PARENT[root2] = root1;RANK[root1]++;} else {PARENT[root1] = root2;RANK[root2]++;}}}for (Edge e : res) {cout << e.vertex1 << " -- " << e.vertex2 << "  " << e.weight << endl;}
}void Union( char vertex_1, char vertex_2 ) {
}int main() {char t[] = {'a', 'b', 'c', 'd', 'e', 'f'};Graph g;g.vertice = vector<char>(t, t + sizeof(t)/sizeof(t[0]));g.edges.push_back(Edge('a', 'b', 4));  // 稀疏图用链来表示(E = O(V)) g.edges.push_back(Edge('a', 'f', 2));  // 如果是密集图(E = O(V*V)), 用矩阵来表示g.edges.push_back(Edge('f', 'b', 5));  // 大部分感兴趣的图是稀疏的g.edges.push_back(Edge('c', 'b', 6));g.edges.push_back(Edge('c', 'f', 1));g.edges.push_back(Edge('f', 'e', 4));g.edges.push_back(Edge('d', 'e', 2));g.edges.push_back(Edge('d', 'c', 3));MST(g);return 0;
}

转载于:https://www.cnblogs.com/logchen/p/10274863.html

算法实践--最小生成树(Kruskal算法)相关推荐

  1. 【数据结构与算法】最小生成树--Kruskal算法 Prim算法

    Kruskal算法 步骤: 1.给边的权值排序 2.从小到大一个一个往里填,如果不成环,保留.如果城环,抛弃. 3.重复步骤2 Prim算法 步骤: 1.将顶点分成两个集合,一个集合是确定了路径的点, ...

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

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

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

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

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

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

  5. 最小生成树kruskal算法

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

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

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

  7. 新颖性搜索(Novelty Search,NS)算法实践——利用NS算法解决迷宫导航问题

    新颖性搜索(Novelty Search,NS)算法实践--利用NS算法解决迷宫导航问题 新颖性搜索(Novelty Search,NS)算法介绍 NS实现基础 NovItem NoveltyArch ...

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

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

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

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

最新文章

  1. ArcGIS JS API 4.10跨域问题(本地切片无法加载)解决办法
  2. 容器化分布式日志组件ExceptionLess的Angular前端UI
  3. 多主机推送公钥、修改配置、修改密码脚本
  4. Java EE 企业网站_基于jsp的企业网站系统-JavaEE实现企业网站系统 - java项目源码...
  5. Linux的Application 内存模型---
  6. 微信手机 WeOS 的可行性到底有多大?
  7. Milne格式MATLAB,matlab考试题
  8. 网易云上线新版容器服务,开放更多Kubernetes功能
  9. 【语音加密】基于matlab GUI语音信号加密解密【含Matlab源码 295期】
  10. 打开网页右下角广告栏慢慢出现,点击慢慢消失
  11. 服务器通过无线modem接入4g网络,24-4G Modem管理配置
  12. 基于FPGA的SPI-Flash控制器的Verilog设计和验证
  13. Rockchip PX30/RK3326 Android开机时间优化
  14. 什么是失血模型和充血模型?(DDD)
  15. TYUT太原理工大学2022数据库考试题型大纲
  16. 第一行代码-第二版(郭霖著)笔记二(Activity)
  17. redis面试:哨兵模式主从切换数据丢失问题
  18. 经典案例--JS购物车
  19. 环境监测系统/智能监测平台---Vue/Node.js
  20. win10内置linux读取u盘raw,U盘或磁盘分区RAW格式恢复方案

热门文章

  1. codeforces 153d(日期转换)特殊题目
  2. python模拟ajax请求_短信炸弹—用Python模拟ajax请求
  3. 找出n个自然数(1,2,3,…,n)中取r个数的组合(C语言)
  4. ACM及各类程序竞赛专业术语
  5. 64位ubuntu 12.04编译linux内核提示mkimage command not found
  6. [图神经网络] 图节点Node表示(DeepWalk与Node2Vec)
  7. 关于keil环境的 三个红点(备忘)
  8. html to txt研究
  9. 房贷断供会有什么严重后果?
  10. 这些贷款合同陷阱你知道多少?