一.克鲁斯卡尔(Kruskal)算法思想
考虑问题的出发点:为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能的小。
克鲁斯卡尔(Kruskal)算法思想:设连通网N=(V,E),令最小生成树初始状态为只有n个顶点而无边的非连通图T=(V,{F}),每个顶点自成一个连通分量在E中选取代价最小的边,若该边依附的顶点落在T中两个不同的连通分量上,则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边依此类推,直至T中所有顶点都在同一连通分量上为止。
三.算法描述
克鲁斯卡尔(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++; // 继续考察下一条权值最小边 } // while DestroySet(F); } // MiniSpanTree_Kruskal