最小生成树 - wolai 笔记

1.基本概念

1.1 生成树

连通图的生成树是包含图中全部顶点的一个极小连通子图;
对于一个带权连通无向图G=(V, E),生成树不同,每颗树的权也不同;

1.2 最小生成树

RG的所有生成树的集合,若TR中边的权值之和最小的生成树,则T称为G的最小生成树(MST)

1.3 最小生成树特性

  • 最小生成树可能有多个,但边的权值之和是唯一且最小的
  • 最小生成树的变数 = 顶点树 - 1
  • 若连通图本身就是一棵树,则其最小生成树就是它本身
  • 只有连通图才有生成树,非连通图只有生成森林

2.Prim算法

2.1 算法思想

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

2.2 特点

  • 时间复杂度:O(|V|^2)
  • 适合用于边稠密图

2.3 伪代码

void Prim(G, T)
{
    T = NULL;    // 初始化空树
    U = {w};    // 添加任一顶点w
    while((V - U) != NULL)  // 若树中不含全部顶点
    {(u, v)是使 u属于U 与 v属于(V-U) ,且权值最小的边
        T = T 并 {(u, v)};  // 边归入树
        U = U 并 {v};    // 顶点归入树
    }
}

3.Kruskal算法

3.1 算法思想

  • 从某一个顶点开始构建生成树;
  • 每次选择一条权值最小的边,使这条边的两头连通(原本已经连通的就不选),
  • 直到所有结点都连通;

2.2 特点

  • 时间复杂度:O(|E|log|E|)
  • 适合用于边稀疏图

2.3 伪代码

void Kruskal(V, T)
{
    T = V;      // 初始化树T,仅含顶点
    numS = n;    // 连通分量数
    while(numS > 1)  // 若连通分量数大于1
    {
        从E中取出权值最小的边(u, v)
        if(v和u属于T中不同的连通分量)
        {
            T = T 并 {(v, u)};  // 将此边加入生成树中
            numS--;        // 连通分量数减1
        }
    }
}



Comment