《数据结构》 ☞ 生成树

生成树:所有顶点均由边连接在一起,但不存在回路的树

一个图可以有许多课不同的生成树

所有生成树具有以下共同特点:

    生成树的顶点个数与图的顶点个数相同

    生成树是图的极小连通子图,去掉一条边则非连通

    一个有n个顶点的连通图的生成树有n-1条边

    在生成树中再加一条边必然形成回路

    生成树中任意两个顶点间的路径是唯一的

无向图的生成树

利用图的深度优先遍历 生成深度优先生成树

利用图的广度优先遍历 生成广度优先生成树

《数据结构》 ☞ 生成树_第1张图片

最小生成树

《数据结构》 ☞ 生成树_第2张图片

最小生成树的典型用途

☞ 欲在n个城市间建立通信网,则n个城市应铺n-1条线路

☞ 但因为每条线路都会有对应的经济成本,而n个城市最多有n(n-1)/2条线路,那么,如何选择n-1条线路,使总费用最少?

数学模型: 顶点--表示城市 有n个

                   边 - 表示线路,有n-1条

                   边的权值 - 表示线路的经济代价

                   连通网 -  表示n个城市间通信网 

MST - Minimum Spanning Tree 最小生成树

MST性质:设N=(V,E)是一个连通网,U是顶点集V的一个非空子集,若边(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一颗包含边(u,v)的最小生成树。

《数据结构》 ☞ 生成树_第3张图片

构造最小生成树,最小生成树可能不唯一

(一)普里姆Prim算法

思想:

☞设N=(V,E)是连通网,TE是N上最小生成树的边的集合

☞初始令U={u0}(u0∈V),TE={}

☞ 在所有的u∈U,v∈V-U的边(u,v)∈E中,找一条代价最小的边(u0,v0)

☞将(u0,v0)并入集合TE,同时v0并入U0

☞重复上述操作直至U=V为止,则T=(V,TE)为N的最小生成树

(二)克鲁斯卡尔Kruskal算法(贪心算法)

思想:

☞ 设连通网N=(V,E),令最小生成树初始状态为只有n个顶点而无边的非连通图T=(V,{}),每个顶点自成一个连通分量

☞ 在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上(即:不能形成环),则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边

☞ 依次类推,直至T中所有顶点都在同一连通分量上为止

prim与Kruskal两种算法的比较

普里姆:选择点,时间复杂度O(n^2)n为顶点数,适用于稠密图(不论稀疏与否,每个点都要与其他点的距离都要计算,所以Pime更适合稠密图)

克鲁斯卡尔:选择边、时间复杂度O(eloge)(e为边数),适用于稀疏图。

你可能感兴趣的:(数据结构,算法)