克鲁斯卡尔(Kruskal)算法
来源:互联网 发布:2015加工贸易数据 编辑:程序博客网 时间:2024/04/28 18:41
克鲁斯卡尔(Kruskal)算法
(只与边相关)
算法描述:克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边又关系,可以证明其时间复杂度为O(nlogn)。
算法过程:
1.将图各边按照权值进行排序
2.将图遍历一次,找出权值最小的边,(条件:此次找出的边不能和已加入最小生成树集合的边构成环),若符合条件,则加入最小生成树的集合中。不符合条件则继续遍历图,寻找下一个最小权值的边。
3.递归重复步骤1,直到找出n-1条边为止(设图有n个结点,则最小生成树的边数应为n-1条),算法结束。得到的就是此图的最小生成树。
克鲁斯卡尔(Kruskal)算法因为只与边相关,则适合求稀疏图的最小生成树。而prime算法因为只与顶点有关,所以适合求稠密图的最小生成树。
#include"stdio.h"#include"stdlib.h"int set[5000];struct node{int a,b,dis;}aa[5002];int find(int x){int r,i;r=x;while(r!=set[r])r=set[r];while(set[x]!=r){i=set[x];set[x]=r;x=i;}return r;}int cmp(const void*a,const void*b){struct node *c,*d;c=(struct node*)a;d=(struct node*)b;return c->dis-d->dis;}int main(){int n,m,i,j,ans;int x,y;while(scanf("%d",&n)!=EOF&&n){m=n*(n-1)/2;for(i=0;i<=5000;i++)set[i]=i;for(i=0;i<m;i++)scanf("%d%d%d",&aa[i].a,&aa[i].b,&aa[i].dis);qsort(aa,m,sizeof(aa[0]),cmp);ans=0;for(i=0;i<m;i++){x=find(aa[i].a);y=find(aa[i].b);if(x!=y){ans+=aa[i].dis;if(x<y) set[y]=x;else set[x]=y;}}printf("%d\n",ans);}return 0;}
- 克鲁斯卡尔(Kruskal)算法
- (Kruskal)克鲁斯卡尔算法
- [数据结构]克鲁斯卡尔(Kruskal)算法
- 克鲁斯卡尔(Kruskal)算法
- 克鲁斯卡尔(Kruskal)算法
- kruskal克鲁斯卡尔算法
- 克鲁斯卡尔算法(Kruskal)
- Prim(普利姆)算法+Kruskal(克鲁斯卡尔)算法
- 最小生成树-kruskal算法(克鲁斯卡尔算法)
- 克鲁斯卡尔(Kruskal)算法求最小生成树
- 克鲁斯卡尔(Kruskal)算法求解最小生成树
- 克鲁斯卡尔(Kruskal)算法求最小生成树
- 克鲁斯卡尔(Kruskal)算法求最小生成树
- 最小生成树之克鲁斯卡尔(kruskal)算法
- 克鲁斯卡尔(Kruskal)算法 Agri-Net
- 最小生成树之Kruskal(克鲁斯卡尔)算法
- 最小生成树-克鲁斯卡尔算法(Kruskal)
- 克鲁斯卡尔(Kruskal)算法 Java实现
- 第一阶段总结--5个实例背后的数据库
- oracle10g 卸载
- Javascript的闭包理解
- 答案与结果
- C# 中的委托和事件
- 克鲁斯卡尔(Kruskal)算法
- 不显示删除回复显示所有回复显示星级回复显示得分回复 触发器问题:如何记录被修改的多行纪录的关键字的原值和新值?
- 规范化-数据库设计原则
- 删除linux的乱码文件
- 浮躁的程序员
- 边界类、控制类和实体类
- 文件和I/O流
- 从北京大雨想起视频会议的容灾设计
- C#读取内存的实例