kruskal算法求最小生成树
来源:互联网 发布:编程培训学校哪个好 编辑:程序博客网 时间:2024/04/29 00:47
kruskal算法是一种使用贪心思路求解无向图的最小生成树的算法。
其大体思路为:将边按权重排序,然后每次选出权最小且不使图产生环的边,作为树的边挂上树。
具体来讲就是这么两个步骤:
1.把边按权重排序。
2.依照1的顺序遍历边:
使用一个并查集来判断加进这条边后图中是否有环。
如果没有环,更新并查集,并把此边加入树。
并查集判断环的回顾:
使用一个数组保存每个点的祖先节点。对于无向图,可以直接按照点的数字大小作为代表元的依据,令值小的为代表元。
如果两个点v,w,判断加入新边e=<v,w>后是否会产生环的思路是:如果v,w加边前的代表元相同,那么就说明v,w间有路,加边后就会成环。
变量使用: 使用edg[]{v1,v2,w}记录每个边的信息,fa[]为并查集,v,e代表图的节点,边数。
以hdu1301为例
#include <bits/stdc++.h>using namespace std;const int maxn=200;struct ed{ int v1,v2,w; bool operator <(const ed b) const{return w<b.w;}}edg[maxn];int v,e,fa[maxn];int findfa(int pos){ if(fa[pos]==pos)return pos; return findfa(fa[pos]);}void init(){ memset(edg,0,sizeof(edg)); char c; int si,cu; e=1; fa[v]=v; for(int i=1;i<v;i++) { fa[i]=i; cin>>c>>si; while(si--) { cin>>c>>cu; edg[e].v1=i; edg[e].v2=c-'A'+1; edg[e].w=cu; e++; } } sort(edg+1,edg+e);}int kruskal(){ int su=0; for(int i=1;i<=e;i++) { int vs=findfa(edg[i].v1),vb=findfa(edg[i].v2); if(vs!=vb) { fa[vb]=vs; su+=edg[i].w; } } return su;}int main(){ while(cin>>v,v!=0) { init(); cout<<kruskal()<<endl; } return 0;}
阅读全文
0 0
- Kruskal算法求最小生成树
- Kruskal 算法 求最小生成树
- 24.kruskal算法 求 最小生成树
- Kruskal算法(求最小生成树)
- Kruskal算法求最小生成树
- Kruskal 算法求最小生成树
- uva1395 Kruskal算法求最小生成树
- hdu1102 kruskal算法求最小生成树
- Kruskal算法求最小生成树
- Kruskal算法求MST(最小生成树)
- 求最小生成树Kruskal算法
- 水题 kruskal算法求最小生成树
- Kruskal算法求最小生成树
- 求最小生成树的Kruskal算法
- kruskal算法求最小生成树
- Kruskal算法求最小生成树 (最小堆优化)
- [算法第一轮复习] kruskal求最小生成树算法
- KrusKal求最小生成树
- dubbo+zookeeper 的简单使用(不涉及集群)
- JIRA笔记-工作中关于JIRA的简单应用
- C语言发展史——程序猿抗争史
- 数据的还原操作mixed和row的操作
- 9种高性能可用高并发的技术架构
- kruskal算法求最小生成树
- 第十一周项目4
- hdu6050 推公式矩阵快速幂
- MYSQL事务和锁
- WAMPserver 修改默认端口号
- 《kubernetes-1.8.0》19-examples-secrets
- java设计模式学习—工厂方法模式
- Java集合框架
- MT7688双摄像头双电机驱动小车(6)应用软件