最小生成树
1、最小生成树的基本概念
生成树:一个连通图的最小连通子图称作该图的生成树。有n个结点的连通图的生成树有n个结点和n-1条边。
一个有n个结点的连通图的生成树是原图的极小连通子图,它包含原图中的所有n个结点,并且有保持图连通的最少的边。
由生成树的定义可知:
①若在生成树中删除一条边,就会使该生成树因变成非连通图而不再满足生成树的定义;
②若在生成树中增加一条边,就会使该生成树因存在回路而不再满足生成树的定义;
③一个连通图的生成树可能有许多。
总结:从生成树的定义显然可以证明,对于有n个结点的无向连通图,无论它的生成树的形状如何,一定有且只有n-1条边。
如果无向连通图是一个带权图,那么它的所有生成树中必有一棵树的权值总和最小的生成树,这棵生成树称为最小代价生成树,简称最小生成树。
从最小生成树的定义可知,构造有n个结点的无向连通带权图的最小生成树,必须满足以下三个条件:
①构造的最小生成树必须包括n个结点;
②构造的最小生成树中有且只有n-1条边;
③构造的最小生成树中不存在回路。
构造最小生成树的方法有许多种,典型的构造方法有两种,一种称作普利姆(Prim)算法,另一种称作克鲁斯卡尔(Kruskal)算法。
2、普利姆算法思想
假设G=(V,E)为一个带权图,其中V为带权图中结点的集合,E为带权图中边的权值集合。设置两个新的集合U和T,其中U用于存放带权图G的最小生成树的结点的集合,T用于存放图G的最小生成树的边的集合。
普利姆算法的思想是:令集合U的初值为U={u0}(即假设构造最小生成树时从结点u0开始),集合T的初值为T={}。从所有结点u∈U和结点v∈V-U的带权边中算出具有最小权值的边(u,v),将结点v加入集合U中,将边(u,v)加入集合T中。如此不断重复,当U=V时则最小生成树构造完毕。此时集合U中存放着最小生成树结点的集合,集合T中存放着最小生成树边的权值集合。具体的构造过程如下图所示。
3、克鲁斯卡尔算法
不同于普利姆算法,克鲁斯卡尔算法是一种按照带权图中边的权值的递增顺序构造最小生成树的方法。
克鲁斯卡尔算法是:设无向连通带权图G=(V,E),其中V为结点的集合,E为边的集合。设带权图G的最小生成树T由结点集合和边的集合构成,其初值为T=(V,{}),即初始时最小生成树T只由带权图G中的结点集合组成,各结点之间没有一条边。这样,最小生成树T中的各个结点各自构成一个连通分量。然后,按照边的权值递增的顺序考察带权图G中的边集合E中的各条边。若被考察的边的两个结点属于T的两个不同的连通分量,则将此边加入到最小生成树T,同时把两个连通分量连接为一个连通分量;若被考察的边的两个结点属于T的同一个连通分量,则将此边舍去。如此下去,当T中的连通分量个数为1时,T中的该连通分量即为带权图G的一棵最小生成树。