最小树之kruskal算法
生成最小树是指在一个无向连通图上选择适当的边,生成一个子连通图满足全部边的权重加起来最小的条件
应用:给出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算法相关推荐
- 最小生成树(Prim、Kruskal)算法,秒懂!
前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚,什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子 ...
- 【数据结构笔记29】最小生成树问题:Prim算法与Kruskal算法
本次笔记内容: 8.1.1 Prim算法 8.1.2 Kruskal算法 文章目录 最小生成树问题 什么是最小生成树(Minimum Spanning Tree) 贪心算法 Prim算法 Kruska ...
- 公路村村通 (30分)【C语言】Prim算法 和 Kruskal算法
目录 题目: 输入格式 输出格式 输入样例 输出样例 问题分析 最小生成树的特点 算法 Prim算法 代码实现 Prim函数:小树变大的过程中记录fee(费用和)和count(已收集的边数) Find ...
- 最小生成树kruskal算法
最小生成树kruskal算法 概述 算法分析 代码 概述 克鲁斯卡尔(Kruskal)(Kruskal)(Kruskal)算法是求连通网的最小生成树的另一种方法.与普里姆(Prim)(Prim)(Pr ...
- 数据结构与算法—最小生成树(Prim算法和Kruskal算法算法详解)
前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚.我们看下百度百科对于最小生成树定义: 一个有 n 个结点的连通图的生成树 ...
- Kruskal算法(克鲁斯卡尔算法)
Kruskal算法 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪心算法的应 ...
- 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)
目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...
- 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)
#include <iostream> using namespace std; //约定: //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, ...
- Kruskal算法 - C语言详解
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总 ...
最新文章
- mysql如何存储表情,如何让mysql支持存储表情
- AppStreamMgr
- Kotlin 与 Java 比较
- python编程中常用的12种基础知识总结
- Cocos2d 3.0继承自Sprite的类在addChild后出现故障
- return另外一个用法
- 基于XML使用MyBatis
- 电脑qq浏览器怎么滚动截长图_电脑怎么快速截图?
- html autoplay属性,HTML autoplay属性用法及代码示例
- 虚幻引擎4的实时渲染流程(直播总结)
- 花千骨与虐死人的源代码
- RGB——三原色到五颜六色
- Python实现多层感知器网络
- QQ2009 Preview 下载 图片大赏+简单评测
- 无法打开源文件opencv2
- 解析陌陌回复发消息别人看不到怎么解决
- lc振荡电路是如何起振的?
- 中国自动驾驶重卡行业发展态势展望与市场供需分析报告2021年版
- Oracle 11g笔记——数据库启动
- 90-Docker详解