生成最小树是指在一个无向连通图上选择适当的边,生成一个子连通图满足全部边的权重加起来最小的条件
应用:给出n个城市和各个城市间的距离,问若要修建若干个公路连通所有城市,问应该如何修建和这时的公路长度。。。

以下是经 黑车司机 总结和优化的最小树算法

用到的数据结构
1.node_set[i] ,节点i所属的集合,刚开始是i
2.size[i],集合i包含的节点,刚开始是1
3.edge[i], edge结构保存无向边的信息,包括两边的节点和边的权重
大概流程:
1.初始化数据结构
2.对edge数组进行升序排序
3.遍历edge数组,如果edge[i]两边的节点来自不同的集合,则将这连个结合合并起来,
直至全部节点都属于同一个集合。
代码和注释:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 100;int node_set[maxn];   //the set node i belong to
int size[maxn];     //the munber of element that in set i
vector<int> ans;  //save the edge that take acceptedstruct Edge{int node1;int node2;int val;
}edge[maxn];void init(int n){for (int i = 0; i < n; i++){size[i] = 1;node_set[i] = i;}return;
}int finds(int n){  //find the set node[n] belong toreturn(node_set[n] == n ? n : node_set[n] = finds(node_set[n]));
}
void show(){for (auto t : ans)printf("%d ----- %d  ( %d )\n", edge[t].node1, edge[t].node2, edge[t].val);
}
void connect(int a, int b){ //connect node a and node b, use it after make sure a and d come from different set int as = finds(a);int bs = finds(b);if (size[as] <= size[bs]){node_set[as] = bs;size[bs]++;}else{node_set[bs] = as;size[as]++;}return;
}int kruskal(int n){    //input the total munber of node return mini length conect all the nodeinit(n);int len = 0;for (int i = 0; i < n; i++){if (finds(edge[i].node1) != finds(edge[i].node2)){connect(edge[i].node1, edge[i].node2);ans.push_back(i);len += edge[i].val;}}show(); return len;
}
int main(){int n, m;  //munber of node and degecin >> n >> m;for (int i = 0; i < m; i++) cin >> edge[i].node1 >> edge[i].node2 >> edge[i].val;sort(edge, edge + m, [](Edge &a, Edge &b){return a.val < b.val; });cout <<"total length of mini stree is :" << kruskal(n) << endl;
}/*
数据用例
6 10
1 2 22
0 1 8
0 2 12
0 3 15
0 4 30
0 5 7
1 5 9
2 3 6
3 4 2
4 5 31
*/

运行结果和分析:


最小树之kruskal算法相关推荐

  1. 最小生成树(Prim、Kruskal)算法,秒懂!

    前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚,什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子 ...

  2. 【数据结构笔记29】最小生成树问题:Prim算法与Kruskal算法

    本次笔记内容: 8.1.1 Prim算法 8.1.2 Kruskal算法 文章目录 最小生成树问题 什么是最小生成树(Minimum Spanning Tree) 贪心算法 Prim算法 Kruska ...

  3. 公路村村通 (30分)【C语言】Prim算法 和 Kruskal算法

    目录 题目: 输入格式 输出格式 输入样例 输出样例 问题分析 最小生成树的特点 算法 Prim算法 代码实现 Prim函数:小树变大的过程中记录fee(费用和)和count(已收集的边数) Find ...

  4. 最小生成树kruskal算法

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

  5. 数据结构与算法—最小生成树(Prim算法和Kruskal算法算法详解)

    前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚.我们看下百度百科对于最小生成树定义: 一个有 n 个结点的连通图的生成树 ...

  6. Kruskal算法(克鲁斯卡尔算法)

    Kruskal算法 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪心算法的应 ...

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

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

  8. 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)

    #include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...

  9. Kruskal算法 - C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树.  例如,对于如上图G4所示的连通网可以有多棵权值总 ...

最新文章

  1. mysql如何存储表情,如何让mysql支持存储表情
  2. AppStreamMgr
  3. Kotlin 与 Java 比较
  4. python编程中常用的12种基础知识总结
  5. Cocos2d 3.0继承自Sprite的类在addChild后出现故障
  6. return另外一个用法
  7. 基于XML使用MyBatis
  8. 电脑qq浏览器怎么滚动截长图_电脑怎么快速截图?
  9. html autoplay属性,HTML autoplay属性用法及代码示例
  10. 虚幻引擎4的实时渲染流程(直播总结)
  11. 花千骨与虐死人的源代码
  12. RGB——三原色到五颜六色
  13. Python实现多层感知器网络
  14. QQ2009 Preview 下载 图片大赏+简单评测
  15. 无法打开源文件opencv2
  16. 解析陌陌回复发消息别人看不到怎么解决
  17. lc振荡电路是如何起振的?
  18. 中国自动驾驶重卡行业发展态势展望与市场供需分析报告2021年版
  19. Oracle 11g笔记——数据库启动
  20. 90-Docker详解

热门文章

  1. 安装Python编译器
  2. 2008-07-31 郁闷的旅行之二
  3. 基于TqSDK的vnpy实盘初始化数据获取
  4. 安装win7 缺少所需的CD/DVD驱动器设备驱动程序
  5. 【操作方法】windows开启、关闭防火墙方法
  6. Android开发-根据起点终点实现直线逐点绘制动画-01
  7. 为什么云教室比传统的PC教室更受欢迎
  8. A - Red and Black
  9. dell t110服务器做系统,企业第一台服务器 戴尔T110 II深度评测
  10. 电气工程转信息技术??我该如何规划未来的人生