文章目录

  • 1. 最小生成树定义
  • 2. Prim 算法
    • 2.1. 算法流程
    • 2.2. 优化
  • 3. kruskal 算法
    • 3.1. 算法流程
    • 3.2. 优化

1. 最小生成树定义


树是指没有环路的图,生成树就是指一个图上面删除一些边,使它没有环路。
最小生成树就是指生成树中边权之和最小的那一种。
上图的最小生成树就是这样:

2. Prim 算法

2.1. 算法流程

就以上图为例:

  1. 先选择一个起始点,我们就以A为例。
  2. 创建一个集合S,用来存储已经在树中间的点。开始时集合那只有点A,即 S={A}S = \{A\}S={A}。
  3. 选择一个连通到集合S中一个点的最小边,其中它的另一个端点不在集合S中。以保证,最小生成树不会形成环。把这条边的不在S集合中的端点加到S集合中。(目前选边AB, S={A,B}S = \{ A, B\}S={A,B})
  4. 重复步骤三,直到所有的点都在S集合中了。
  5. 答案就是刚才所选的边的边权和啦。

时间复杂度: O(nm+m)O(nm+m)O(nm+m)

2.2. 优化

这个算法的时间的主要瓶颈就是在我们寻找那一条边的边权最小的时候,那么注意到这里其实是可以通过堆优化的。代码如下:

int ans = 0;
int index = 1;
h.push(point(0, 1));
while (index <= n) {int x = h.top().id, d = h.top().w;h.pop();if (S[x]) continue;S[x] = 1;++index;ans += d;for (int i = 0; i < G[x].size(); ++i) {int y = G[x][i].v, z = G[x][i].w;if (!S[y]) {h.push(point(z, y));}}
}

时间复杂度: O(nlog⁡m+m)O(n\log m + m)O(nlogm+m)

3. kruskal 算法

3.1. 算法流程

还是以上图为例:

  1. 首先第一步最开始,先给边排序。
  2. 选择一个边权最小的边,判断它的两个端点是否原来已经连通,如果没有连通的话,就选这条边。以保证这个树上不会出现回路。
  3. 重复步骤二,直到选出n−1n-1n−1条边为止.
  4. 上面流程得到的树就是最小生成树。

时间复杂度:O(n2)O(n^2)O(n2)

3.2. 优化

算法的主要时间瓶颈就是在如何判断原来两个点已经连通,如果用DFS或者BFS的话,效率较低,所以我们这里使用并查集优化。

sort(E.begin(), E.end(), cmp);
int index = 1, np = 0;
int ans = 0;
while (index <= n - 1) {if (np >= E.size()) break;node now = E[np++];if (getf(now.u) == getf(now.v)) continue;++index;ans += now.w;merage(now.u, now.v);
}

时间复杂度:O(mlog⁡m+mα(n))O(m \log m+m \alpha (n))O(mlogm+mα(n))

==by szdytom ==

[C++] 最小生成树相关推荐

  1. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  2. [kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)

    L - 还是畅通工程 题目链接:https://vjudge.net/contest/66965#problem/L 题目: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府&qu ...

  3. 图的算法专题——最小生成树

    概要: Prim算法 Kruskal算法 1.Prim算法 算法流程: (1)对图G(V,E)设置集合S来存放已被并入的顶点,然后执行n次(2)(3) (2)每次从未并入顶点集合中选择与集合S最近的一 ...

  4. 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理

    蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...

  5. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...

  6. [vijos1234]口袋的天空最小生成树

    题目链接:https://vijos.org/p/1234 白天刚刚写完prim的算法,晚上就心血来潮的打了一道最小生成树的题 虽然有题解说可以用prim做,但是这道题明显是加最小的边,感觉krusk ...

  7. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  8. LA 5717枚举+最小生成树回路性质

    1 /*LA 5717 2 <训练指南>P343 3 最小生成树的回路性质 4 在生成的最小生成树上,新增一条边e(u,v) 5 若原图上u到v的路径的最大边大于e,则删除此边,加上e,否 ...

  9. 技术图文:如何利用C# 实现 Prim 最小生成树算法?

    背景 我们上一篇图文介绍了 如何利用 C# 实现 Kruskal 最小生成树算法?,Kruskal 算法通过寻找边最优的方式来构造最小生成树,本篇图文介绍如何利用 C# 实现 Prim 最小生成树算法 ...

  10. 技术图文:如何利用C# 实现 Kruskal 最小生成树算法?

    背景 以前我写过一些图文来介绍有关数据结构与算法的知识: 8大排序算法之:直接插入排序(Straight Insertion Sort) 8大排序算法之:希尔插入排序(Shell Insertion ...

最新文章

  1. 简单生产消费模式的代码流程(Java代码)
  2. m3u直播源_教你创建电视直播源
  3. jqGrid(转)--一个前端表格控件
  4. scrapy学习资料汇总
  5. jquery如何实现ajax技术,使用JavaScript和jQuery简单实现Ajax技术(示例代码)
  6. 解决asterisk sip呼叫 488 no acceptable here
  7. 神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(python列表与元组)
  8. 【转】5.2高性能IO模型浅析
  9. 编程关键词介绍...
  10. input自适应_一种Dynamic ReLU:自适应参数化ReLU激活函数(调参记录13)
  11. 数据量太大?用数据库水平切分搞定!
  12. 最全面、最详细的“前端模块化”总结
  13. spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别
  14. OpenCV学习笔记(六)——对XML和YAML文件实现I/O操作
  15. Kubernetes 之 MySQL 持久存储和故障转移(十一)
  16. JavaCore/HeapDump文件分析工具
  17. centos 添加路由命令
  18. c# 中控 触摸精灵_触摸精灵脚本编辑器
  19. Python OpenCV _1基本操作(画图,循环播放图像,鼠标事件,读取中文路径中的图片)
  20. 时光机穿梭-管理修改

热门文章

  1. 利用DroidCam将手机摄像头打造成电脑摄像头
  2. Android开发程序获取GPS信息步骤
  3. 基于SSM的企业人事管理系统(Spring+SpringMVC+Mybatis)
  4. U盘强制格式化的解决方案
  5. python唯美壁纸_Python爬虫教程-爬取5K分辨率超清唯美壁纸源码
  6. TwinCAT3入门使用经验
  7. IT服务管理、IT运维管理、IT运营管理
  8. AdventureWorks2012.mdf的使用
  9. 如何解决Flash CS6打开后闪退的问题
  10. Linux----Ubuntu系统官网下载iso镜像文件