博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最小生成树 克鲁斯卡尔(Kruskal)算法求最小生成树
阅读量:4627 次
发布时间:2019-06-09

本文共 898 字,大约阅读时间需要 2 分钟。

Kruskal算法的过程:
(1) 将全部边按照权值由小到大排序。 (2) 按顺序(边权由小到大的顺序)考虑没条边,只要这条边和我们已经选择的边步构成圈,就保留这条边,否则放弃这条边。
算法 成功选择(n-1)条边后,形成一个棵最小生成树,当然如果算法无法选择出(n-1)条边,则说明原图不连通。
图中的路径按照权值的大小的排序为
AF 1;
BE 4;
BD 5;
BC 6;
DC:10;
BF 11;
DF 14;
AE 16;
AB 17;
EF 33;
算法的处理过程如下
先选A,F不在一个集合中,所以选AF。
E,D不在一个一个集合中,可以选
 
B,D不在一个集合中,可选BD
B,C不在一个集合中,可选BC
B,D在同一个集合中,放弃BD,
选BF
至此所有的的顶点都连起来,算法结束= =
 
 
;u[i],v[i]分别储存顶点,w[i]保存权值,用r[i]表示边的序号
这里对权值的排序可以这样写
1 bool cmp(int i,int j)2 {3     return w[i]

然后我们需要考虑新加入的边会不会和先前选好的边形成环,即判断u,v,是否在同一连通分量中,这里我们用并查集来查找,然后合并

f[x]表示x的,合并只需条语句f[x]=y;。然后实现实现克鲁斯卡尔的算法的代码如下

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 #define maxn 5000 7 int f[maxn]; 8 int u[maxn],v[maxn],w[maxn],r[maxn]; 9 int n,m;10 bool cmp(int i,int j)11 {12 return w[i]

 

 

 

转载于:https://www.cnblogs.com/NaCl/p/4705570.html

你可能感兴趣的文章
Redis持久化
查看>>
linux xampp eclipse xdebug 无法进入断点
查看>>
app启动时间命令
查看>>
Eclipse下修改工程名
查看>>
request.getSession()
查看>>
iphone 在设置了initial-scale=1 之后,在设置滚动条之后,没有滑动效果的解决办法...
查看>>
虚拟目录
查看>>
面向对象的3大特性
查看>>
Express4.x API (四):Router (译)
查看>>
device.cpp
查看>>
django学习笔记--数据库中的多表操作
查看>>
LESS 的 operation 是 特性
查看>>
[VBScript] 自动删除2小时以前生成的文件
查看>>
通过BeanShell获取UUID并将参数传递给Jmeter
查看>>
[03] 处理注解:反射
查看>>
示例-添加删除附件
查看>>
textarea输入框限制字数(JS)
查看>>
2.1 mac下多版本jdk的安装和管理
查看>>
调手表
查看>>
Wannafly挑战赛14
查看>>