图:最小生成树(Prim算法,Kruskal算法)

1.最小生成树的概念

又称最小代价树。

1.生成树

回顾之前生成树的概念:
连通图(无向图)的生成树是包含图中全部顶点的一个极小连通子图(边尽可能的少,但要保持连通)。
在这篇文章中有详细的讲解:图的基本概念

2.最小生成树

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

最小生成树具有以下特点:

  • 最小生成树可能有多个,但边的权值之和总是唯一且最小的。
  • 最小生成树的边数=顶点数–1。
  • 砍掉一条则不连通,增加一条边则会出现回路。

注意:

  • 如果一个连通图本身就是一棵树,则其最小生成树就是它本身。
  • 只有连通图才有生成树,非连通图只有生成森林。

这里提出两种求最小生成树的算法:.Prim算法和Kruskal算法。

2.Prim算法(普利姆)

1.算法步骤

  1. 从图里的某一个顶点开始构建生成树
  2. 每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。

2.时间复杂度

时间复杂度:O(IV|2)适合用于边稠密图(E的值比较大).

3.算法思想

  1. 创建两个数组,一个用于标记各个节点是否已经加入树,一个用于存储各个节点加入树的最小代价。
  2. 第1轮:循环遍历所有个结点,找到lowCast(代价)最低的,且还没加入树的顶点。
  3. 再次循环遍历,更新还没加入的各个顶点的lowCast值。
  4. 第2轮:循环遍历所有个结点,找到lowCast最低的,且还没加入树的顶点。

每一轮是O(N)的时间复杂度,总共进行N-1轮,所以总的时间复杂度就是O(N2)。

3.Kruskal算法(克鲁斯卡尔)

1.算法步骤

  1. 每次选择—条权值最小的边,使这条边的两头连通(原本已经连通的就不选)
  2. 直到所有结点都连通。

2.时间复杂度

时间复杂度:O(|E|log2lE|),适合用于边稀疏图(E的值比较小).

3.算法思想

  1. 初始:将各条边按权值排序。
  2. 第1轮︰检查第1条边的两个顶点是否连通(是否属于同一个集合)。(并查集的操作)
  3. 若不连通,就连起来。
  4. 若连通,则跳过。

共执行e轮,每轮使用并查集判断两个顶点是否属于同一集合,需要O(log2e)总时间复杂度O(elog2e).

你可能感兴趣的:(数据结构与算法,图论,算法,数据结构)