最小生成树之克鲁斯卡尔算法
2013-10-25 13:51
369 查看
克鲁斯卡尔算法思想:
1.有个Struct定义边的信息.
2.通过并查集和排序找得到最小权值(函数:1.UFset,2.Find,3.Union。)
3.找到权值的最小值的父亲关系相同放弃,否拿下Kruskal;
4.一直把所有的点合成通过连通分量。
通俗来说:从小到大的边权值寻找,一路不重复地加入新的最小权值,直到当前所有的点num大于n点加提前结束完。(当前是最优)。
1.有个Struct定义边的信息.
2.通过并查集和排序找得到最小权值(函数:1.UFset,2.Find,3.Union。)
3.找到权值的最小值的父亲关系相同放弃,否拿下Kruskal;
4.一直把所有的点合成通过连通分量。
#define Max 2000000 #define Maxn 2000 struct edge { int u,v; int w; }edges[Max]; int parent[Maxn]; int n,m; int i,j; void UFset() { for(i=0;i<=n;i++) parent[i]=i; } int Find(int x) { if(x!=parent[x]) parent[x]=Find(parent[x]); return parent[x]; } void Union(int R1,int R2) { int r1=Find(R1); int r2=Find(R2); parent[r1]=r2; } int cmp(const void * a,const void * b) { return (*(struct edge *)a).w - (*(struct edge *)b).w; } int Kruskal() { int sumweight=0; int num=0; int u,v; UFset(); for(i=0;i<m;i++) { u=edges[i].u; v=edges[i].v; if(Find(u)!=Find(v)) { sumweight+=edges[i].w; num++; Union(u,v); } if(num>=n-1)break; } return sumweight; } qsort(edges,m,sizeof(edges[0]),cmp);
通俗来说:从小到大的边权值寻找,一路不重复地加入新的最小权值,直到当前所有的点num大于n点加提前结束完。(当前是最优)。
相关文章推荐
- 动易2006序列号破解算法公布
- C#数据结构与算法揭秘二
- 浅析STL中的常用算法
- JavaScript 组件之旅(二)编码实现和算法
- 将15位身份证补全为18位身份证的算法示例详解
- C++算法系列之日历生成的算法代码
- 1 2 3 4 5 6 7 8 9 = 110的java实现
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 【代码】Pythonの代码片段
- STL中算法
- 数据结构&算法学习
- 算法的时间复杂度
- 算法导论:选择排序的原理与实现
- PHP实现四种常用的排序算法
- 图解插入排序算法
- 一些常见算法的JavaScript实现
- 平方根sqrt()函数的底层算法效率
- 二叉搜索树的一些相关算法介绍
- 欧几里德算法(辗转相处法)练手
- 面试中常见的一些算法问题