最小生成树--kruskal算法
来源:互联网 发布:西部数码域名续费价格 编辑:程序博客网 时间:2024/06/07 02:19
2016.12.30
算法思想:
先将边按照权值排序,从权值最小的边开始枚举,如果当前边连接的两个点不属于同一集合,就将这两个点连起来(用到的数据结构是并查集)
一直到枚举完所有的边,此时生成的就是最小生成树
#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;int cnt, ans;int f[505];struct d{ int x, y, v;}e[250005];void init(void);void add(int ,int ,int );bool cmp(d , d);void kruskal(void);int find(int );int main(void){ int i, j, n, z; cin >> z; while (z--) { init(); kruskal(); cout << ans << endl; } return 0;}void kruskal(void){ int i, x, y; for (i = 1; i <= cnt; ++i) { x = find(e[i].x); y = find(e[i].y); if (x != y) { f[x] = y; ans = ans < e[i].v ? e[i].v : ans; } }}void add(int x, int y,int z){ e[++cnt].x = x; e[cnt].y = y; e[cnt].v = z;}int find(int x){ return f[x] == x ? x : f[x] = find(f[x]);}void init(void){ int i, j, n, t; ans = cnt = 0; memset(e, 0, sizeof(e)); cin >> n; for (i = 1; i <= n; ++i) for (j = 1; j <= n; ++j) { cin >> t; if (i != j) add(i, j, t); } for (i = 1; i <= n; ++i) f[i] = i; sort(e+1, e+cnt+1, cmp);}bool cmp(d a, d b){ return a.v < b.v;}
0 0
- Kruskal 最小生成树算法
- 最小生成树Kruskal算法
- 最小生成树----Kruskal算法
- 最小生成树kruskal算法
- 最小生成树 - Kruskal算法
- 最小生成树---Kruskal算法
- 最小生成树(kruskal算法)
- 最小生成树,kruskal算法
- 最小生成树--kruskal算法
- 最小生成树---kruskal算法
- 最小生成树--Kruskal算法
- 最小生成树 : Kruskal 算法
- 最小生成树-Kruskal算法
- 最小生成树 Kruskal算法
- 最小生成树kruskal算法
- 最小生成树kruskal算法
- 【Kruskal】算法 最小生成树
- 最小生成树kruskal算法
- 前端基础篇
- MySQL中的Online DDL
- ListView中不显示HeaderView
- Rx学习笔记和总结
- linux系统下基于opencv的行人跟踪(一)
- 最小生成树--kruskal算法
- Java语言基础-7.数组
- 安卓DVM与JVM的区别
- 在Azure HDInsight中创建R服务器,并利用Spark集群进行分布式R分析
- mysql 行级锁的使用以及死锁的预防
- Ambari-整体介绍
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
- 安卓模拟器配置了摄像头还是显示黑白棋盘
- 微信小程序开发资料汇总