c语言之克鲁斯卡尔算法

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

原文出处:http://www.91computer.com/datastruct/ds_tu4.asp

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

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

利用克鲁斯卡尔(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++;   // 继续考察下一条权值最小边
 } // while
DestroySet(F);
} // MiniSpanTree_Kruskal 

你可能感兴趣的:(c,数据存储,kruskal,算法设计)