文章目录

  • 无向图的最小连通分量——Kruskal算法
  • 无向图的最小连通分量——Prim算法

无向图的最小连通分量——Kruskal算法

此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。

  1. 把图中的所有边按代价从小到大排序;
  2. 把图中的n个顶点看成独立的n棵树组成的森林;
  3. 按权值从小到大选择边,所选的边连接的两个顶点,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。
  4. 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。

参考文章图解:什么是最小生成树?

    vector<int> parents;int count;void init(int n){count = n+1;parents = vector<int>(n+1, 0);for(int i=0; i<=n; ++i){parents[i] = i;}}int find(int x){if(x != parents[x])return find(parents[x]);return parents[x];}void Union(int x, int y){int rootX = find(x);int rootY = find(y);if(rootX == rootY)return ;parents[rootX] = rootY;count--;}bool isConnected(int x, int y){return find(x) == find(y);}/*输入:n, 节点数量connections, {{a, b, w}} 无向图中的起点、终点、权重*/int minimumCost(int n, vector<vector<int>>& connections) {sort(connections.begin(), connections.end(), [&](vector<int>& a, vector<int>& b){return a[2] < b[2];});init(n);int ans = 0;for(int i=0; i<connections.size(); ++i){int x,y,w;x = connections[i][0];y = connections[i][1];w = connections[i][2];if(! isConnected(x, y)){Union(x, y);ans += w;}}return count == 2? ans : -1;}

无向图的最小连通分量——Prim算法

此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。

图的所有顶点集合为VV;初始令集合u={s},v=V−uu={s},v=V−u;
在两个集合u,vu,v能够组成的边中,选择一条代价最小的边(u0,v0)(u0,v0),加入到最小生成树中,并把v0v0并入到集合u中。
重复上述步骤,直到最小生成树有n-1条边或者n个顶点为止。

class Solution {public:using rhs = pair<int, int>;int minimumCost(int n, vector<vector<int>>& connections) {vector<vector<rhs>> edge(n+1);for(auto x : connections){int a = x[0];int b = x[1];int w = x[2];edge[a].push_back(make_pair(w, b));edge[b].push_back(make_pair(w, a));}priority_queue<rhs, vector<rhs>, greater<rhs>> m_que;m_que.push(make_pair(0, 1));vector<bool> used(n+1, false);int res = 0;int cnt = 0;while(m_que.size()){auto top = m_que.top();m_que.pop();int cost = top.first;int b = top.second;if(used[b]){continue;}used[b] = true;res += cost;cnt++;for(auto x : edge[b]){int y = x.second;int w = x.first;if(!used[y]){m_que.push(make_pair(w, y));}}}if(cnt == n)return res;return -1;}
};

数据结构——最小连通图相关推荐

  1. 数据结构 - 最小堆最大堆

    可以在O(nlogn)的时间复杂度内完成排序 典型的用法是,寻找 第k个/前k个 最大/最小元素,k个有序序列合并 1.合并K个升序链表(最小堆实现) 或许可以改进成每次堆只存放K个元素? # Def ...

  2. 【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?

    目录 什么是连通图? 什么是连通分量? 那什么是极大连通子图呢?联想到的极小连通子图又是什么呢? 强连通图 强连通分量 "强强"在那里-连通图和强连通图的区别? 创作不易,不妨点赞

  3. 数据结构最小堆C++实现

    1.最小堆的结构: 左右子女的元素均小于等于父节点的元素,叫最小堆:左右子女的元素均大于等于父节点的元素,叫最大堆. 2.最小堆的建立过程如下图所示: 所有节点从上往下,从左往右一次标号0,1,2,. ...

  4. java带权连通图上最小权边,连通图最小生成树的算法及实现

    连通图的最小生成树 生成树定义: 无向连通图G的极小连通子图,称为它的生成树.(n个顶点,n-1条边) 考虑一下下面这个图 上图是一个完全图,它的生成树不是唯一的,我们列出最特殊的两种情况 上面2个图 ...

  5. java堆排序图解_108-堆排序的思路图解_清华毕业老程序员亲授通俗易懂的Java数据结构和算法​​​​教程_Java视频-51CTO学院...

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  6. 考研数据结构填空题整合_做题版

    考研数据结构填空题整合 目录 考研数据结构填空题整合 一.ZYL组 ZYL组一 ZYL组二 ZYL组三 ZYL组四 ZYL组五 ZYL组六 ZYL组七 ZYL组八 二.TJP组 TJP组一 TJP组二 ...

  7. 【算法数据结构体系篇class16】:图 拓扑排序

    一.图 1)由点的集合和边的集合构成 2)虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达 3)边上可能带有权值 二.图结构的表达 1)邻接表法 类似哈希表, key就是当前节点.value ...

  8. 二叉树线索化示意图_103-线索化二叉树思路图解

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  9. java 线性的排序算法_077-线性查找分析和实现

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

最新文章

  1. java 设计一个geometricobject类,geometricobject类
  2. R语言ggplot2可视化:ggplot2可视化水平堆叠条形图、并且在每个堆叠条形图的内部居中添加百分比文本标签信息
  3. [译] Lenses:可组合函数式编程的 Getter 和 Setter(第十九部分)
  4. ACM 配置中心实战:Spring + MyBatis + Druid + ACM
  5. Kettle实例解析
  6. Linux下常用的压缩与解压命令
  7. Python高级——正则表达式与re模块
  8. 离线安装gcc(CentOS7)
  9. socket 和 SocketServer 模块
  10. 博士德服务器帐套维护密码忘记,T+忘记账套主管、admin密码
  11. 集成电路制造工艺及设备
  12. JavaScript网页特效5则
  13. lua table的__index ,setmetable()的一些操作
  14. C语言要点系统复习三:scanf读取缓冲区的那些事
  15. android授权新浪微博 服务端,android应用关于新浪微博授权登陆解决方案
  16. 关于ele框架样式修改
  17. Kafka自带的Zookeeper未授权访问漏洞
  18. Unity3d程序必备的几种设计模式
  19. 三端口 DC-DC 变换器(C 题)-- 2021年全国大学生电子设计竞赛试题
  20. @linux下tar解压失败a lone zero解决方法

热门文章

  1. java 行 javac不行_javac可以java不行
  2. Bootstrap学习资料整理
  3. 支持HTML的邮箱,Yeah.net邮箱全面支持HTML5
  4. 【181128】VC++ 实现绘制波形图动态图源代码
  5. 再不入坑就晚了,深度神经网络概念大整理,最简单的神经网络是什么样子?
  6. windows ip冲突检查
  7. 使用EasyExcel进行文件的读取与写出(根据目录看更清晰)
  8. TEE 开发入门知识
  9. 华为云年度峰会开启云+AI+5G聚变元年
  10. Xshell Plus 6标准版详细安装破解教程,解决评估过期问题(附注册机,全网独家可用),非学校/家庭免费版