生成树的定义
设连通图G=(V,E),从任一顶点遍历,则图中边分成两部分:E(G) = T(G)+ B(G),T(G)为遍历通过的边,B(G)为遍历时未通过的边,G’(V,T)为G的子图,称之为G的一棵生成树。
生成树分为 深度优先生成树 和 广度优先生成树。
注意:
1. 图的生成树不是唯一的。
2. 生成树G’是图G的极小连通子图。即V(G)=V(G’),G’是连通的,且在G的所有连通子图中边数最少(n个顶点,n-1条 边)。
最小生成树
1. 问题的起源
城市架设通讯网,网中n个城市n个顶点,两城市间线路为一条边,每条边都有相应的权重,即架设相应线路的费用。
问题1:n个城市间的通讯网,至少要多少条线路?
答:n个城市间最少的可行的通讯线路就是一棵生成树,至少要n-1条边。
问题2:怎样选择n-1条线路,使总费用最少?
答:合理的取n-1条边,并使边权总和为最少。
2. 最小生成树定义
给定一个带权图,构造带权图的一棵生成树, 使树中所有边的权总和为最小。
3. 最小生成树的构造算法
Prim 算法 和 kruskal 算法
最小生成树的构造方法(Prim)
假设G=(V,E)是一个无向带权图,生成的最小生成树为MinT= (V,T),其中V为顶点的集合,T为边的集合。求T的步骤如下:
1. 初始化U={u0},T={ },其中U为一个新设置的顶点的集合,初始U中只含有顶点u0,这里假设在构造最小生成树时,从顶点u0 出发;
2. 对所有点u属于U集合,点v属于(V-U)集合,两点所构成的边(u,v)中,找一条权最小的边(u’,v’),将这条边加入到集合T中,将顶点v’加入到 集合U中;
3. 如果U=V,则算法结束,否则重复以上步骤。最后得到最小生成树 MinT=<V,T>,其中T为最小生成树的边的集合。
未完待续。。。