【数据结构基础C++】图论08-Prim 算法实现最小生成树

1.最小生成树Minimum Span Tree

在一个含有n个顶点,m条边,带权无向连通图中,存在一个含有n个顶点,n-1条边,且权值总和最小的一棵树;

1.1 存在个数

最小生成树可能有多个,当有相同权值的边时,可以选择其中一条边。当图中每一条边的权值都相同,该图的左右生成树都是最小生成树;

唯一性:当图中的每一条边的权值都不相同时,最小生成树是唯一的。

1.2 切分定理 Cut Property

在图中找到n-1条边,连接n个顶点,总权值最小;
【切分】:把图中的结点分为两部分;
【数据结构基础C++】图论08-Prim 算法实现最小生成树_第1张图片
【横切边】:如果一个边的两个端点,属于切分不同的两边,这个边称为横切边;(图中红色的边)

【数据结构基础C++】图论08-Prim 算法实现最小生成树_第2张图片
【切分定理】:在一幅连通加权无向图中,给定任意的切分,如果有一条横切边的权值严格小于所有其他横切边,则这条边必然属于图的最小生成树;
(上图中7-0边的权值0.16 是最小生成树的一部分)

1.3 应用

  • 电缆布线设计
  • 网络设计
  • 电路设计等

2.普利姆算法

Prim 算法的每一步都会为一棵生长中的树添加一条边,该树最开始只有一个顶点。

  1. 选一个起始结点做切分,找到横切边中最小那个边。蓝色集合,红色集合为切分;
    【数据结构基础C++】图论08-Prim 算法实现最小生成树_第3张图片
  2. 图中最小的横切边 0-7,权值0.16,而顶点7没有被访问过,则将顶点 7 加入红色结点集合 {0,7},形成新的切分;
    【数据结构基础C++】图论08-Prim 算法实现最小生成树_第4张图片
  3. {0,7} 顶点与其他结点形成新的横切边;
    【数据结构基础C++】图论08-Prim 算法实现最小生成树_第5张图片
  4. 选出横切边最小的权值边,图中 7-1 边
  5. 重复切分,选横切边
    【数据结构基础C++】图论08-Prim 算法实现最小生成树_第6张图片
  6. 在横切边中选出最小的权值边,可以用数据结构 最小堆 实现。

3.代码

#pragma once
#include 

你可能感兴趣的:(数据结构C++,数据结构,算法,c++)