最小生成树的Prim算法以及Kruskal算法(C语言)

Posted bfhonor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小生成树的Prim算法以及Kruskal算法(C语言)相关的知识,希望对你有一定的参考价值。

一、最小生成树

  • 连通图生成树包含图中全部顶点的一个极小连通子图。
  • 边尽可能的少,但要保持连通
  • 若图中顶点数为n,则它的生成树含有 n-1 条边。对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。

(一)最小生成树(最小代价树)

  • 对于⼀个带权连通⽆向图G = (V, E),⽣成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有⽣成树的集合,若T为R中边的权值之和最⼩的⽣成树,则T称为G的最⼩⽣成树(Minimum-Spanning-Tree,MST)
  • 最小生成树可能有多个,但边的权值之和总是唯一且最小的
  • 最小生成树的边数 = 顶点数 - 1。砍掉一条则不连通,增加一条边则会出现回路

(二)Prim 算法(普里姆)

  • Prim 算法(普里姆):从某一个顶点开始构建生成树;每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。
  • P城开始进行建成生成树。
  • 农场开始进行建成生成树。
  • 通过不同的结点开始,建成的最小生成树结构有可能不一样。

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

  • Kruskal 算法(克鲁斯卡尔):每次选择⼀条权值最⼩的边,使这条边的两头连通(原本已经连通的就不选)直到所有结点都连通。

(四)Prim 算法 v.s. Kruskal 算法

1. Prim 算法的实现思想

  • 初始:从V0开始
  • 第1轮:循环遍历所有个结点,找到lowCost最低的,且还没加⼊树的顶点

  • 第2轮:循环遍历所有个结点,找到lowCost最低的,且还没加⼊树的顶点

  • 第3轮:循环遍历所有个结点,找到lowCost最低的,且还没加⼊树的顶点

  • 第4轮:循环遍历所有个结点,找到lowCost最低的,且还没加⼊树的顶点


  • 第5轮:循环遍历所有个结点,找到lowCost最低的,且还没加⼊树的顶点


2. Kruskal 算法的实现思想

  • 初始:将各条边按权值排序
  • 第1轮:检查第1条边的两个顶点是否连通(是否属于同⼀个集合)
  • 第2轮:检查第2条边的两个顶点是否连通(是否属于同⼀个集合)
  • 第3轮:检查第3条边的两个顶点是否连通(是否属于同⼀个集合)
  • 第4轮:检查第4条边的两个顶点是否连通(是否属于同⼀个集合)
  • 第5轮:检查第5条边的两个顶点是否连通(是否属于同⼀个集合)
  • 第6轮:检查第6条边的两个顶点是否连通(是否属于同⼀个集合)
  • 共执⾏ e 轮,每轮判断两个顶点是否属于同⼀集合,需要 O(log2e)总时间复杂度 O(elog2e)

以上是关于最小生成树的Prim算法以及Kruskal算法(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

Kruskal算法和Prim算法构造它的一棵最小代价生成树的过程

关于最小生成树的Prim算法和Kruskal算法

最小生成树-Prim算法与Kruskal算法

prim和kruscal算法得到的最小生成树是不是一样

图--05---贪心算法Prim算法kruskal算法

最小生成树及Prim算法及Kruskal算法的代码实现