克鲁斯卡尔(Kruskal)算法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法都是用于解决最小生成树问题的算法。 最小生成树问题是指在一个无向连通图中,找到一棵生成树,使得树上所有边的权值之和最小。生成树是指一个无向图的生成子图,它是一棵树,且包含图中所有顶点。 下面我们分别介绍普里姆算法克鲁斯卡尔算法: 1. 普里姆算法 普里姆算法是一种贪心算法,它从一个任意点开始,逐步扩展生成树,每次选择当前生成树到未加入的点中距离最近的点,并将其加入生成树。 具体实现步骤如下: - 随机选择一个起始点,将其加入生成树。 - 在生成树中的所有节点中,找到到未加入生成树的节点中距离最小的节点,将其加入生成树。 - 重复以上步骤,直到生成树包含了所有节点。 2. 克鲁斯卡尔算法 克鲁斯卡尔算法也是一种贪心算法,它从边集合中选择边,逐步扩展生成树,每次选择当前边集合中权值最小的边,并将其加入生成树。 具体实现步骤如下: - 将所有边按照权值从小到大排序。 - 从权值最小的边开始,逐个加入生成树,如果加入当前边会形成环,则不加入该边。 - 重复以上步骤,直到生成树包含了所有节点。 两种算法的时间复杂度都是O(ElogE),其中E为边数。普里姆算法在处理稠密图时效率更高,而克鲁斯卡尔算法在处理稀疏图时效率更高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值