kurskal算法更适合稀疏图

kruskal算法伪代码:

 int kruskal(){
令最小生成树的边权之和为ans, 最小生成树的当前边数为Num_Edge;
将所有边按边权从小到大排序;
for (从小到大枚举所有的边){
if (当前测试边的两个端点在不同的连通块中){
将测试边加入最小生成树中;
ans += 测试边的边权;
最小生成树的当前边数Num_Edge加一;
当前边数Num_Edge等于顶点数减1是结束循环;
} }
return ans;
}

具体实现:

 struct edge{
int u, v; //边的两个端点编号
int cost; //边权
}E[MAXV]; bool cmp(edge a, edge b){
return a.cost < b.cost;
}
int father[MAXV]; //并查集数组 //并查集查询函数
int findFather(int x){
int a = x;
while (x != father[x]){
x = father[x];
} //路径压缩
while (a != father[a]){
int z = a;
a = father[a];
father[z] = x;
} return x;
} //kruskal函数返回最小生成树的边权之和,参数n为顶点个数, m为图的边数
int kruskal(int n, int m){
int ans = , Num_Edge = ; //最小边权之和,当前生成树的边数
//初始化并查集
for (int i = ; i <= n; i++){
father[i] = i;
} //对所有边排序
sort(E, E + m, cmp);
//遍历所有的边
for (int i = ; i < m; i++){
int faU = findFather(E[i].u); //查询测试边两个端点所在集合的根节点
int faV = findFather(E[i].v);
if (faU != faV){
father[faV] = faU;
ans += E[i].cost;
Num_Edge++;
if (Num_Edge == n - ) break; //如果已经建成了一棵树,跳出循环
}
}
if (Num_Edge != n - ) return -; //当图不连通时,返回-1
else return ans; //否则返回最小生成树的边权之和
}

最新文章

  1. Docker容器时间与宿主机时间不一致的问题
  2. Swift学习--闭包中的懒加载(四)
  3. mmap和普通文件读写的区别和比较 &amp; mmap的注意点
  4. 设计模式----代理模式(Proxy)
  5. perl use utf8
  6. Vertica: 基于DBMS架构的列存储数据仓库
  7. SEO-友情链接注意事项
  8. Linux C 程序的开发环境
  9. Web桌面应用框架3:Web桌面应用开发的N种Style
  10. hbase 性能优化 (转载)
  11. Python3标准库
  12. ecplise导入项目报错而文件不报错
  13. python学习笔记01-变量
  14. springmvc 项目完整示例09 maven项目创建
  15. case when then的用法-leetcode交换工资
  16. Unity 光照着色器
  17. Linux命令行与shell脚本编程大全.第3版(文字版) 超清文字-非扫描版 [免积分、免登录]
  18. 微信公众号支付(JSAPI)对接备忘
  19. 利用cve-2017-11882的一次渗透测试
  20. 常用shell命令实战

热门文章

  1. [CTSC2008]网络管理 [树剖+整体二分]
  2. 如何调试TaskPaper的JavaScript上下文?
  3. CodeForces - 1107E 区间DP
  4. 松软科技课堂:jQuery 效果 - 淡入淡出
  5. 518-零钱兑换 II(完全背包-求方案总数)
  6. 原生js判断设备类型
  7. PHP获取小程序码并返回前端显示图片
  8. 录入规则文件名到CSV文件
  9. Win10 JDK 环境变量配置
  10. SpringBoot整合WEB开发--(六)CROS支持