生成树:所有顶点均由边连接在一起,但不存在回路的树
一个图可以有许多课不同的生成树
所有生成树具有以下共同特点:
生成树的顶点个数与图的顶点个数相同
生成树是图的极小连通子图,去掉一条边则非连通
一个有n个顶点的连通图的生成树有n-1条边
在生成树中再加一条边必然形成回路
生成树中任意两个顶点间的路径是唯一的
无向图的生成树
利用图的深度优先遍历 生成深度优先生成树
利用图的广度优先遍历 生成广度优先生成树
最小生成树
最小生成树的典型用途
☞ 欲在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)的最小生成树。
构造最小生成树,最小生成树可能不唯一
(一)普里姆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为边数),适用于稀疏图。