最小生成树
1. 最小生成树
1.1 生成树的定义
1.2 最小生成树的定义
2. 构造最小生成树
2.1 MST性质
2.2 prim算法
U是V的一个顶点子集
第一步: 一开始U里只有一个顶点,假设是V1,( U = {V1},TE = {} )
第二步: 找一条代价最小的边,看图可以发现是(V1,V3)
第三步: 将(V1,V3)并入到TE,同时V3并入到U,U = { V1,V3 } , TE = { (V1,V3) }
重复上述操作
U = { V1,V3 },TE = { ( V1,V3) }
V1、V3 ∈ U,在V-U中找一条代价最小的边,看图可以发现(V3,V6)
将(V3,V6)并入到TE,同时将V3并入到U,U = {v1,v3,v6}, TE = { (V1,V3),(v3,v6) }
U = { V1,V3,V6 }, TE = { (V1,V3), (V3,V6)
V1、V3、V6 ∈ U,在V-U中找一条代价最小的边,看图可以发现(V6,V4)
将(V6,V4)并入到TE,同时将V4并入到U,( U = {V1,V3,V6,V4 }, TE = { (V1,V3),(v3,v6),(V6,V4) }
… …
直到U的个数==V的个数
2.2.1 prim算法实现
每加入了一个新顶点,都要将它到(V-U)集合的顶点做个比较
如果,权值比先lowcost值小,那么就更新shortEdge数组(挑每个边与其他边的最小权值)
在shortEdge数组中,将最小边的lowcost赋值为0,代表加入到了U集合
2.3 Kruskal算法
2.3.1 Kruskal算法实现
parent数组所形成的树与图中的树是完全不一样的
parent只是用来标识,判断两个顶点是否同一个连通分量中,
并不是像树中双亲孩子的概念,在parent数组中,v2是v1的孩子,
但我们看图是可以发现,v1和v2并没有线是连着的,
因此我们用parent数组,来找两个顶点的根结点是否相同,实际上是来判断
两个顶点是否在同一个连通分量中,
如果根结点相同,那么两个顶点在同一个连通分量,因此要舍弃
如果根结点不同,那么两个顶点在不在一个连通分量,因此要合并到同一个连通分量,合并的方法就是使根结点相同
3. Prim算法与Kruskal算法比较
Prim算法:找每个顶点上的最小边,直到把所有顶点加入到顶点集合中,构成最小生成树
Kruskal算法: 每次找最小边,并且不能形成环路<在选择边的过程中,必须每次都有新的顶点出现>