什么是最小生成树(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];
else
return find(PARENT[vertex]);
} void MST(Graph& g) {
vector<Edge> res; for (auto c : g.vertice) {
PARENT[c] = c;
RANK[c] = ;
} 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[])); g.edges.push_back(Edge('a', 'b', )); // 稀疏图用链来表示(E = O(V))
g.edges.push_back(Edge('a', 'f', )); // 如果是密集图(E = O(V*V)), 用矩阵来表示
g.edges.push_back(Edge('f', 'b', )); // 大部分感兴趣的图是稀疏的
g.edges.push_back(Edge('c', 'b', ));
g.edges.push_back(Edge('c', 'f', ));
g.edges.push_back(Edge('f', 'e', ));
g.edges.push_back(Edge('d', 'e', ));
g.edges.push_back(Edge('d', 'c', )); MST(g); return ;
}

算法实践--最小生成树(Kruskal算法)的更多相关文章

  1. 【转】最小生成树——Kruskal算法

    [转]最小生成树--Kruskal算法 标签(空格分隔): 算法 本文是转载,原文在最小生成树-Prim算法和Kruskal算法,因为复试的时候只用到Kruskal算法即可,故这里不再涉及Prim算法 ...

  2. 算法起步之Kruskal算法

    原文:算法起步之Kruskal算法 说完并查集我们接着再来看这个算法,趁热打铁嘛.什么是最小生成树呢,很形象的一个形容就是铺自来水管道,一个村庄有很多的农舍,其实这个村庄我们可以看成一个图,而农舍就是 ...

  3. 个性化排序算法实践(五)——DCN算法

    wide&deep在个性化排序算法中是影响力比较大的工作了.wide部分是手动特征交叉(负责memorization),deep部分利用mlp来实现高阶特征交叉(负责generalizatio ...

  4. 个性化排序算法实践(三)——deepFM算法

    FM通过对于每一位特征的隐变量内积来提取特征组合,最后的结果也不错,虽然理论上FM可以对高阶特征组合进行建模,但实际上因为计算复杂度原因,一般都只用到了二阶特征组合.对于高阶特征组合来说,我们很自然想 ...

  5. 最小生成树——kruskal算法

    kruskal和prim都是解决最小生成树问题,都是选取最小边,但kruskal是通过对所有边按从小到大的顺序排过一次序之后,配合并查集实现的.我们取出一条边,判断如果它的始点和终点属于同一棵树,那么 ...

  6. 最小生成树Kruskal算法

    Kruskal算法就是把图中的所有边权值排序,然后从最小的边权值开始查找,连接图中的点,当该边的权值较小,但是连接在途中后会形成回路时就舍弃该边,寻找下一边,以此类推,假设有n个点,则只需要查找n-1 ...

  7. 最小生成树------Kruskal算法

    Kruskal最小生成树算法的概略描述:1 T=Φ:2 while(T的边少于n-1条) {3 从E中选取一条最小成本的边(v,w):4 从E中删去(v,w):5 if((v,w)在T中不生成环) { ...

  8. 求最小生成树——Kruskal算法

    给定一个带权值的无向图,要求权值之和最小的生成树,常用的算法有Kruskal算法和Prim算法.这篇文章先介绍Kruskal算法. Kruskal算法的基本思想:先将所有边按权值从小到大排序,然后按顺 ...

  9. 最小生成树 kruskal算法&prim算法

    (先更新到这,后面有时间再补,嘤嘤嘤) 今天给大家简单的讲一下最小生成树的问题吧!(ps:本人目前还比较菜,所以最小生成树最后的结果只能输出最小的权值,不能打印最小生成树的路径) 本Tianc在刚学的 ...

随机推荐

  1. 记不住的Android活动的生命周期

    Activity基类定义了管理一个互动的生命周期的一系列事件. Activity生命周期的一系列事件onCreate()——当前活动首次被创建时使用.onStart()——当前活动对用户可见时调用.o ...

  2. Python3解析dex文件

    一.说明 1.1 背景说明 看<加密与解密>的时候反复听说“PE文件格式”,到Android安全兴起就不断听说“dex文件格式”.意思是看得懂的,但自己不能手解析一番总觉得不踏实,所以决定 ...

  3. vim 插件 -- ctags

    vim ctags 插件实现代码跳转的功能.希望在一个项目中快速的找到函数,变量,宏等定义的地方. 下载 http://ctags.sourceforge.net/ 安装 tar -jxvf ctag ...

  4. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer 一.前言 关于第一节的 ...

  5. Centos7修改分区空间

    一:缩小/home空间 1.1:备份/home内容 cp -r /home/* /homebak 1.2:删除挂载/home umount /home 1.3:删除/home所在lv lvremove ...

  6. 一篇提及如何通过串口读取并提取GPS信号的论文

    一篇提及如何通过串口读取并提取GPS信号的论文 作者:崔杰 梁计春 王国军 目前,在用计算机进行数据传输时,常用的是串行通信方式.在Visual C++的编程中,既可以用Windows API函数进行 ...

  7. 使用jsoup轻松爬数据

    刚刚学习爬虫,感觉使用jsoup爬虫挺容易的.记录一下自己爬取数据的过程. Jsoup介绍: Jsoup 是一个 Java 的开源HTML解析器,可直接解析某个URL地址.HTML文本内容.使用Jso ...

  8. python+flask开发小白第二天

    使用VSCode编译python web页面 1.先从最基础的说起吧,关于VSCode的使用: 运行python程序与运行java,c,c++程序一样,需要新建一个文件,第一个文件建议不要新建在本地的 ...

  9. junit断言和junit注释assert

    JUnit - 使用断言 断言 所有的断言都包含在 Assert 类中 public class Assert extends java.lang.Object 这个类提供了很多有用的断言方法来编写测 ...

  10. WEBBASE篇: 第四篇, CSS知识2

    CSS知识2 一, 尺寸 与 边框 CSS单位 1,尺寸单位:(1)px 像素   (2)%   (3) in 英寸  lin = 2.54cm (4)pt 磅 1pt = 1/72in    ppi ...