最小生成树——克鲁斯卡尔(Kruskal)算法
Kruskal算法的基本思想是以边为主导的地位,始终都是选择当前可用的最小权值的边。具体实现如下:
(1)设一个有n个顶点的连通网络G(V,E),最初先构造一个只有n个顶点,没有边的非连通图T={V,Ø},图中每个顶点自成一个连通分量。
(2)当在E中选择一条具有最小权值的边时,若该边的两个顶点落在不同的连通分量上,则将此边加入T中。否则,即这两条边落在同一连通分量上,则将此边舍弃(以后永不再用),重新选择一条权值最小的边。
(3)如此重复下去,直到所有顶点在同一个连通分量上为止。
例题:如图所示,求最小生成树,并输出依次选择的各条边及最终求得的最小生成树的权
测试数据
输入:
7 9
1 2 28
1 6 10
2 3 16
2 7 14
3 4 12
4 5 22
4 7 18
5 6 25
5 7 24
输出:
1 6 10
3 4 12
2 7 14
2 3 16
4 5 22
5 6 25
weight of MST is 99
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 110
#define MAXM 110
struct edge
{int u,v,w;
}edges[MAXN];
int parent[MAXN];
int n,m;
int i,j;
void UFset()
{for(i=0;i<n;i++)parent[i]=-1;
}
int Find(int x)
{int s;for(s=x;parent[s]>=0;s=parent[s]);while(s!=x){int temp=parent[x];parent[x]=s;x=temp;}return s;
}
void Union(int R1,int R2)
{int r1=Find(R1),r2=Find(R2);int temp=parent[r1]+parent[r2];if(parent[r1]>parent[r2]){parent[r1]=r2;parent[r2]=temp;}else{parent[r2]=r1;parent[r1]=temp;}
}bool cmp(edge a,edge b)///比较函数
{return a.w<b.w;
}void Kruskal()
{int sumweight=0;///生成树的权值int num=0; ///已选用的边的数量int u,v; ///选用边的两个顶点UFset();for(i=0;i<m;i++)///一条边一条地从小到大排查,直到生成最小生成树{u=edges[i].u;v=edges[i].v;if(Find(u)!=Find(v)){printf("%d %d %d\n",u,v,edges[i].w);sumweight+=edges[i].w; num++;Union(u,v);}if(num>=n-1) break;}printf("weight of MST is %d\n",sumweight);
}
int main()
{int u,v,w;while(scanf("%d%d",&n,&m)!=EOF){for(i=0;i<m;i++){scanf("%d%d%d",&u,&v,&w);edges[i].u=u;edges[i].v=v;edges[i].w=w;}sort(edges,edges+m,cmp);///按照权值从小到大排序Kruskal();}
}
最小生成树——克鲁斯卡尔(Kruskal)算法相关推荐
- 7、最小生成树,克鲁斯卡尔(Kruskal)算法
1)算法的基本思想: 前面我们学习过Prim算法,他是一种以某个节点出发,按权值递增的次序选择合适的边来构造最小生成树的方法,他的时间复杂度为O(n2),与顶点有关,而与边无边,所以适合求边稠密的图的 ...
- 克鲁斯卡尔算法c语言,最小生成树-克鲁斯卡尔(Kruskal)算法
1. 克鲁斯卡尔算法简介 克鲁斯卡尔算法是一种用来寻找最小生成树的算法(用来求加权连通图的最小生成树的算法).在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边. 而具体 ...
- 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)
目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...
- 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
- 算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树
之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,就相当于先 ...
- 【算法】克鲁斯卡尔 (Kruskal) 算法
目录 1.概述 2.代码实现 2.1.并查集 2.2.邻接矩阵存储图 2.3.邻接表存储图 2.4.测试代码 3.应用 本文参考: <数据结构教程>第 5 版 李春葆 主编 1.概述 (1 ...
- 算法之克鲁斯卡尔(Kruskal)算法
克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路 具体做法:首先 ...
- 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法
图是一种基础又重要的数据结构,图的生成树是图的一个极小连通子图.最小生成树是无向连通网的所有生成树中边的权值之和最小的一棵生成树.求图的最小生成树可以牵引出很多经典的题目,例如在N个城市之间建立通讯网 ...
- Java实现之克鲁斯卡尔(Kruskal)算法
一.问题引入 1.问题引入 1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权),比如A-B距离12公里 3)问:如何修路保证各个站点都 ...
- 【数据结构与算法】克鲁斯卡尔(Kruskal)算法
一,应用场景 公交站问题 1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权),比如 A - B距离12公里 3)问:如何修路保证各个站 ...
最新文章
- 了解的四大关键性概念
- android 图片切换,仿百叶窗效果
- ESP32实验板linux环境中下载固件报错解决办法
- linux脚本重启进程,linux下通过脚本实现自动重启程序
- Apollo自动驾驶入门课程第①讲—无人驾驶概览
- arcade 物理系统_如何使用Python和Arcade库创建2D游戏
- hadoop生态系统学习之路(十)MR将结果输出到hbase
- 测试唯一ID支持多大的并发量
- 15crmo焊接后多长时间探伤_焊工必看:掌握钢结构焊接最重要的10个知识,不愁拿不到高工资!...
- 131. 理解MVC
- 《决战大数据大数据的关键思考 升级版》PDF电子书分享
- 力的吸引,是否因为负动量
- 记一次js调试(attachEvent, onchange, onpropertychange)
- ffmpeg的一些用法,不定期更新
- 在电脑上使用考研APP的方法(亲测有效)
- 小程序微信运动时间戳格式转换+列表渲染微信运动数据
- 带你一探究竟财务报表软件!
- 终极 Shell——ZSH
- android viewpager标题,ViewPager顶部导航栏联动效果(标题栏条目多)
- Jenkins + Gitlab+ Docker + SpringBoot 构建流水线