术语:
树(Tree):
不含圈的连通图称为树。
生成树(SpanningTree):
设T是图G的一个子图,如果T是一棵树,且v(T)
= v(G),则称T是G的一个生成树。// v()为点集。
最小生成树(MinimalSpanningTree):
权值最小的生成树称为最小生成树。
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
求解最小生成树问题,最常见的两种算法:Kruskal算法和Prim算法。
一、Prim算法:
基本概念:
Prim算法是用于生成无向带权连通图的MST的一种算法,并且可以解决边权为负值的情况。Prim算法从任一顶点s开始,初始化V' ={s},每次贪心地选取跨越V与V - V' 的最小边,扩大现有的子树V‘,直到其遍及图中的所有顶点。
算法流程:
(1) 标记所有点为未访问,初始化距离数组
(2) 选定任一顶点作为起点,标记其已访问,dist = 0
(3) 找出所有未访问过的点中距离值最小的点u,标记u已访问,将最后一次松弛的边加入生成树
(4) 用点u的相邻边进行松弛,被松弛的点v记录下(u,v)这条边
(5) 重复操作(3)和(4)直到所有点都访问过
二、Kruskal算法:
基本概念:
Kruskal算法将图中的每一顶点视为一个独立的集合,首先将图中的所有边按权值从小到大排序,接着按顺序选择每条边,如果这条边的两个端点不属于同一个集合,那么将它们所在的集合合并,同时将这条边加入边集E‘。直到所有的顶点都属于同一个集合时,E’就是一棵最小生成树。
算法流程:
(1)将图G看做一个森林,每个顶点为一棵独立的树
(2)将所有边加入集合S,即一开始S = E
(3)从S中拿出一条最短的边(u,v),如果u和v不在同一棵树内,连接u,v合并两棵树,同时将(u,v)加入生成树的边集E‘
(4)重复(3)直至所有点属于同一棵树,边集E’就是一棵最小生成树