数据结构---最小生成树

一、最小生成树的概念

  (生成树:连通图的生成树是包含图中全部顶点的一个极小连通子图,若图中顶点数为n,则它的生成树含有n-1条边。对于生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路)

    对于一个带权连通无向图G=(,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有生成树的集合,若7为R中边的权值之和最小的生成树,则T称为G的最小生成树(Minimum-Spanning-Tiee,MST)

  如果一个连通图本身就是一棵树,则其最小生成树就是它本身。

  只有连通图才有生成树,非连通图只有生成森林。

二、Prim算法(普利姆算法)

  从某个顶点开始构建生成树;每次将代价最小的新顶点纳入生成树,知道所有顶点都纳入为止。

三、Kruskal 算法 (克鲁斯卡尔算法)

  每次选择一条权值最小的边,使这条边的两头连通,(原本已经连通的就不选),直到所有结点都连通。 (顺序为 学校-P城、矿场-渔村、农村-电站、P城-矿场、农村-P城,至此全部连接)

  四、算法对比

  Prim算法:时间复杂度(与顶点相关),适用于边稠密图O(|V|^2)

  Kruskal算法: 时间复杂度(与边相关),适用于边稀疏图(O|E|log2^|E|)

五、算法实现
  Prim算法:

  设置两个数组,一个用于标记各节点是否加入树,另一个用于表示各节点加入树的最低代价。(如果两边不相连,则最低代价设置为无穷)。

  第一轮处理:循环遍历哥哥节点,找到代价最低的还没有加入树的顶点。然后再次遍历代价数组,更新各个节点的代价值。(如果新加入的顶点与其他顶点代价值更小,因此要进行更新)以此类推

 Kruskal算法: 初始将各个边按照权值大小的顺序排序。
  第一轮:检查第1条边的两个顶点是否连通。

  第二轮:检查第2条边的两个顶点是否连通。(以此类推,直到所有顶点都连通起来,如果以连通 则跳过)

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值