克鲁斯卡尔算法(Kruskal)
来源:互联网 发布:qq群搜索排名优化 编辑:程序博客网 时间:2024/04/26 03:59
克鲁斯卡尔(Kruskal)算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。假设
1) 设置
2) 将图
实现克鲁斯卡尔算法的关键是,如何判断选取的边是否与生成树中已保留的边形成回路,这可以通过判断边的两个顶点所在的连通分量的方法来解决。
为此设置一个辅助数组
采用
typedef struct { int u; //边的起始顶点 int v; //边的终止顶点 int w; //边的权值 } Edge;
Kruskal算法如下:
void SortEdge(MGraph g,Edge E[]) //从邻接矩阵产生权值递增的边集{ int i,j,k=0; Edge temp; for (i=0;i<g.vexnum;i++) for (j=0;j<g.vexnum;j++) if (g.edges[i][j]<INF) { E[k].u=i; E[k].v=j; E[k].w=g.edges[i][j]; k++; } for (i=1;i<k;i++) //按权值递增有序进行直接插入排序 { temp=E[i]; j=i-1; //从右向左在有序区E[0..i-1]中找E[i]的插入位置 while (j>=0 && temp.w<E[j].w) { E[j+1]=E[j]; //将权值大于E[i].w的记录后移 j--; } E[j+1]=temp; //在j+1处插入E[i] }}void Kruskal(Edge E[],int n,int e){ int i,j,m1,m2,sn1,sn2,k; int vset[MAXE]; for (i=0;i<n;i++) vset[i]=i; //初始化辅助数组 k=1; //k表示当前构造最小生成树的第几条边,初值为1 j=0; //E中边的下标,初值为0 while (k<n) //生成的边数小于n时循环 { m1=E[j].u;m2=E[j].v; //取一条边的头尾顶点 sn1=vset[m1];sn2=vset[m2]; //分别得到两个顶点所属的集合编号 if (sn1!=sn2) //两顶点属于不同的集合,该边是最小生成树的一条边 { printf(" (%d,%d):%d\n",m1,m2,E[j].w); k++; //生成边数增1 for (i=0;i<n;i++) //两个集合统一编号 if (vset[i]==sn2) //集合编号为sn2的改为sn1 vset[i]=sn1; } j++; //扫描下一条边 }}
克鲁斯卡尔算法的时间复杂度为
1 0
- 克鲁斯卡尔(Kruskal)算法
- 克鲁斯卡尔(Kruskal)算法
- kruskal克鲁斯卡尔算法
- 克鲁斯卡尔算法(Kruskal)
- 克鲁斯卡尔算法(Kruskal)模板
- 克鲁斯卡尔(Kruskal)算法
- (Kruskal)克鲁斯卡尔算法
- kruskal's algorithm.[克鲁斯卡尔算法]
- [数据结构]克鲁斯卡尔(Kruskal)算法
- Kruskal(克鲁斯卡尔)
- 克鲁斯卡尔Kruskal
- 普利姆(prim)算法和克鲁斯卡尔(kruskal)算法
- 普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法
- Prim(普利姆)算法+Kruskal(克鲁斯卡尔)算法
- 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法
- 最小生成树-kruskal算法(克鲁斯卡尔算法)
- 最小生成树---克鲁斯卡尔kruskal算法
- 克鲁斯卡尔(Kruskal)算法求最小生成树
- UI 实现多线程方式之四 GCD之自定义并行队列
- Spring Batch MultiResourceItemReader example(八)
- 在Makefile中无缝连接字符串
- iOS开发分分钟搞定C语言 —— 运算符
- 通过反射创建单例模式的另一个实例
- 克鲁斯卡尔算法(Kruskal)
- Spark修炼之道(基础篇)——Linux大数据开发基础:第十四节:Shell编程入门(六)
- test命令在shell脚本中的应用
- 如果饭店不是自己的,最好别去
- UI 实现多线程方式之四 GCD之函数作为参数
- java程序防止sql注入的方法
- 一道受用终身的测试题
- Reading <Effective Java>
- iOS编程------SQLite / 数据库