博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kruskal算法
阅读量:5330 次
发布时间:2019-06-14

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

Kruskal算法是求最小生成树的一种算法,运用了贪心的思想,十分常用。算法流程大体如下:将m条边按边权从小到大排序,枚举每条边,如果该边的起点和终点已经在最小生成树中,则跳过,否则就将这条边加入到最小生成树中。具体实现方面会借助于并查集,来判断两个点是否在最小生成树中(已连通)。

1 #include 
2 #include
3 4 using namespace std; 5 6 struct Edge { 7 int u, v, w; 8 bool operator < (const Edge& rhs) const { 9 return w < rhs.w;10 } //规定边的优先级用于排序11 } edge[maxm];12 13 int n, m, fa[maxn];14 15 int dj_find(int i) {16 if (i == fa[i]) return i;17 else return fa[i] = dj_find(fa[i]);18 }19 20 inline void dj_merge(int a, int b) {21 a = dj_find(a), b = dj_find(b);22 if (a != b) fa[a] = b;23 } //定义并查集的查询合并操作24 25 inline int Kruskal() {26 int cnt = 0, sum = 0;27 for (int i = 1; i <= n; ++i) fa[i] = i;28 sort(edge + 1, edge + m + 1); //按边权排序29 for (int i = 1; i <= m; ++i) {30 int u = edge[i].u, v = edge[i].v;31 if (dj_find(u) != dj_find(v)) {32 dj_merge(u, v);33 sum += edge[i].w;34 ++cnt;35 } //若边的起点和终点之前未连通,则连通36 if (cnt == n - 1) return sum;37 } //最小生成树有n-1条边38 return -1;39 }
Kruskal算法

 

呃呃,附上一道裸题,USACO习题最短网络,在洛谷上的链接为:

 

转载于:https://www.cnblogs.com/Mr94Kevin/p/7413499.html

你可能感兴趣的文章
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
微信内置浏览器不支持 onclick 如何解决?(原因是因为内面中的内容或者标签大部分是动态生成的)...
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
记字符编码与转义符的纠缠
查看>>
NEYC 2017 游记
查看>>
【BZOJ 3669】 [Noi2014]魔法森林 LCT维护动态最小生成树
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
对Python中yield的理解
查看>>
NailTech 公司网站制作思路
查看>>
Shiro权限控制框架
查看>>
java第六次作业
查看>>
vsftpd虚拟用户【公司系统部分享】
查看>>
盒子box在网页中居中的方法
查看>>
Python之旅Day14 JQuery部分
查看>>
二十一、 Memento 备忘录(行为型模式)
查看>>
python 3.X中打包二进制数据存储字符串出错原因分析
查看>>
core--线程池
查看>>
B+树介绍
查看>>