克鲁斯卡尔(Kruskal)算法

来源:互联网 发布:java 发邮件代码 编辑:程序博客网 时间:2024/05/16 01:40

一.克鲁斯卡尔(Kruskal)算法思想

考虑问题的出发点:为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能的小。

克鲁斯卡尔(Kruskal)算法思想:设连通网N=(V,E),令最小生成树初始状态为只有n个顶点而无边的非连通图T=(V,{F}),每个顶点自成一个连通分量在E中选取代价最小的边,若该边依附的顶点落在T中两个不同的连通分量上,则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边依此类推,直至T中所有顶点都在同一连通分量上为止。

二.利用克鲁斯卡尔(Kruskal)算法构造最小生成树

例:利用克鲁斯卡尔(Kruskal)算法对下面的连通网构造一棵最小生成树。

克鲁斯卡尔(Kruskal)算法构造最小生成树

利用克鲁斯卡尔(Kruskal)算法构造最小生成树的步骤:

克鲁斯卡尔(Kruskal)算法构造最小生成树
三.算法描述

克鲁斯卡尔(Kruskal)算法描述

数据存储结构:

typedef struct { VertexType vex1; VertexType vex2; VRType weight;}EdgeType;typedef ElemType EdgeType;typedef struct {         // 有向网的定义 VertexType vexs[MAX_VERTEX_NUM];  // 顶点信息 EdgeType edge[MAX_EDGE_NUM];    // 边的信息 int vexnum,arcnum;   // 图中顶点的数目和边的数目}ELGraph;

克鲁斯卡尔(Kruskal)算法描述:

void MiniSpanTree_Kruskal(ELGraph G, SqList& MSTree){// G.edge 中依权值从小到大存放有向网中各边,按克鲁斯卡尔// 算法求得生成树的边存放在顺序表 MSTree 中MFSet F;InitSet(F, G.vexnum);    // 将森林F初始化为n棵树的集合InitList(MSTree, G.vexnum); // 初始化生成树为空树i=0; k=1;while( k<G.vexnum ) {  e = G.edge[i];     // 取第 i 条权值最小的边     r1 = fix_mfset(F, LocateVex(e.vex1));   r2 = fix_mfset(F, LocateVex(e.vex2)); // 返回两个顶点所在树的树根 if (r1 != r2) {    // 选定生成树上第k条边  if (ListInsert(MSTree, k, e)) k++; // 插入生成树   mix_mfset(F, r1, r2);  // 将两棵树归并为一棵树  } // if   i++;   // 继续考察下一条权值最小边 } // whileDestroySet(F);} // MiniSpanTree_Kruskal