minimum spanning tree,MST
MST性质:
设一个带权无向图G(V,E,W) (V代表点集,E代表边集,W代表权值集),且T为G的一颗生成树,对于E中任意一条不属于T的边e,将其加入T中,会产生一条环(否则T不连通),如果e始终是环中权值最大的一条边,那么说明T满足MST性质。
引理1:
对于图G(V,E,W)的两颗生成树T1和T2,若它们都满足MST性质,则它们的权值和相同
定理1:
一颗生成树T是最小生成树,当且仅当它满足MST性质
Prim算法:
Prim算法基于一种贪心的思想,通过局部最优策略,每次将一条边加入所构建的生成树中,加完n-1条边后,保证最后所得的生成树是整体最优的,即最小生成树。
Prim算法将图中的每个点分成三种状态:
第一种tree点,表示该点已经在所构造的生成树中。
第二种fringe点,表示还没在树中,但是和Tree点相邻(有一条边直接相连),是即将要加入生成树中的候选点。
第三种unseen点,其他的点,表示还没有检测到的点。
那么Prim算法步骤为:
1:初始时将所有点初始化成unseen,并且随机将一个点S设为tree点(如1号点)。
2:将所有与S相邻的点设为fringe。
3:如果图中还存在fringe点,则到4,否则到6。
4:在所有连接一个fringe点和一个tree点的边中,取权值最小的边e(u,v),不妨设u为tree点,v为fringe点,将v点设为tree点。
5:将所有与v相邻的unseen点设为fringe,并将e加入到构建的生成树中。转到3。
6 : 如果图中所有点均为tree点,则图的一个最小生成树找到。否则原图不存在最小生成树。
7:算法结束。